In this notebook we conduct exploratory factor analyses (EFAs) on the datasets for our studies of concepts of mental life, in which each participants judged the various mental capacities of a particular target entity. We analyze datasets for adults and children from each of our five field sites: the US, Ghana, Thailand, China, and Vanuatu.

This notebook contains secondary analyses, parallel to the results presented in the main text, in which we recoded responses of “kinda” to be equivalent to “yes” (i.e., coded as 1) and use tetrachoric rather than Pearson correlations.

Adults

Samples

  country   n
       US 127
    Ghana 150
 Thailand 150
    China 136
  Vanuatu 148
    Total 711

Factor retention: parallel analysis

Exploratory factor analysis

Factor loadings

Congruence

Bootstrapped congruence

Children

Samples

  country   n
       US 117
    Ghana 150
 Thailand 152
    China 131
  Vanuatu 143
    Total 693

Factor retention: parallel analysis

Exploratory factor analysis

Factor loadings

Congruence

See All samples, below.

Bootstrapped congruence

All samples

Congruence

Jaccard Similarity

Developmental comparisons

Variance accounted for

Interfactor correlations

US ADULTS
          F1        F2        F3
F1 1.0000000 0.4947534 0.4804340
F2 0.4947534 1.0000000 0.5291443
F3 0.4804340 0.5291443 1.0000000

US CHILDREN
          F1        F2        F3
F1 1.0000000 0.5415083 0.3161305
F2 0.5415083 1.0000000 0.4435483
F3 0.3161305 0.4435483 1.0000000
GHANA ADULTS
          F1        F2        F3
F1 1.0000000 0.2798815 0.3582925
F2 0.2798815 1.0000000 0.2425925
F3 0.3582925 0.2425925 1.0000000

GHANA CHILDREN
          F1        F2        F3
F1 1.0000000 0.5710736 0.1796716
F2 0.5710736 1.0000000 0.3896234
F3 0.1796716 0.3896234 1.0000000
THAILAND ADULTS
          F1        F2        F3
F1 1.0000000 0.4506808 0.3488039
F2 0.4506808 1.0000000 0.4871667
F3 0.3488039 0.4871667 1.0000000

THAILAND CHILDREN
            F1        F2        F3          F4
F1  1.00000000 0.5216686 0.3079502 -0.01011904
F2  0.52166859 1.0000000 0.4330757  0.10812086
F3  0.30795020 0.4330757 1.0000000  0.26630370
F4 -0.01011904 0.1081209 0.2663037  1.00000000
CHINA ADULTS
          F1        F2
F1 1.0000000 0.5539927
F2 0.5539927 1.0000000

CHINA CHILDREN
          F1        F2        F3        F4
F1 1.0000000 0.3387503 0.4822502 0.3791206
F2 0.3387503 1.0000000 0.1854269 0.2362745
F3 0.4822502 0.1854269 1.0000000 0.1783880
F4 0.3791206 0.2362745 0.1783880 1.0000000
VANUATU ADULTS
          F1        F2
F1 1.0000000 0.6904623
F2 0.6904623 1.0000000

VANUATU CHILDREN
          F1        F2        F3
F1 1.0000000 0.3665866 0.5096434
F2 0.3665866 1.0000000 0.3013293
F3 0.5096434 0.3013293 1.0000000
LS0tCnRpdGxlOiAiQ29uY2VwdHMgb2YgbWVudGFsIGxpZmUgYWNyb3NzIGN1bHR1cmVzOiBTZWNvbmRhcnkgYW5hbHlzaXMiCnN1YnRpdGxlOiAiRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIHVzaW5nIGZ1bGwgZGF0YXNldHMsIHRldHJhY2hvcmljIGNvcnJlbGF0aW9ucywgYW5kIG9ibGlxdWUgdHJhbnNmb3JtYXRpb25zIgphdXRob3JzOiAiKipLYXJhIFdlaXNtYW4qKiwgQ3Jpc3RpbmUgSC4gTGVnYXJlLCBSYWNoZWwgRS4gU21pdGgsIFZpdmlhbiBBLiBEem9rb3RvLCBGZWxpY2l0eSBBdWxpbm8sIEVtaWx5IE5nLCBKb2huIEMuIER1bGluLCBOaWNvbGUgUm9zcy1aZWhuZGVyLCBKb3NodWEgRC4gQnJhaGluc2t5LCAmIFRhbnlhIE0uIEx1aHJtYW5uIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZSA9IEYsIHdhcm5pbmcgPSBGQUxTRSkKYGBgCgpJbiB0aGlzIG5vdGVib29rIHdlIGNvbmR1Y3QgZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2VzIChFRkFzKSBvbiB0aGUgZGF0YXNldHMgZm9yIG91ciBzdHVkaWVzIG9mIGNvbmNlcHRzIG9mIG1lbnRhbCBsaWZlLCBpbiB3aGljaCBlYWNoIHBhcnRpY2lwYW50cyBqdWRnZWQgdGhlIHZhcmlvdXMgbWVudGFsIGNhcGFjaXRpZXMgb2YgYSBwYXJ0aWN1bGFyIHRhcmdldCBlbnRpdHkuIFdlIGFuYWx5emUgZGF0YXNldHMgZm9yIGFkdWx0cyBhbmQgY2hpbGRyZW4gZnJvbSBlYWNoIG9mIG91ciBmaXZlIGZpZWxkIHNpdGVzOiB0aGUgVVMsIEdoYW5hLCBUaGFpbGFuZCwgQ2hpbmEsIGFuZCBWYW51YXR1LiAKClRoaXMgbm90ZWJvb2sgY29udGFpbnMgc2Vjb25kYXJ5IGFuYWx5c2VzLCBwYXJhbGxlbCB0byB0aGUgcmVzdWx0cyBwcmVzZW50ZWQgaW4gdGhlIG1haW4gdGV4dCwgaW4gd2hpY2ggd2UgcmVjb2RlZCByZXNwb25zZXMgb2YgImtpbmRhIiB0byBiZSBlcXVpdmFsZW50IHRvICJ5ZXMiIChpLmUuLCBjb2RlZCBhcyAxKSBhbmQgdXNlIHRldHJhY2hvcmljIHJhdGhlciB0aGFuIFBlYXJzb24gY29ycmVsYXRpb25zLgoKCmBgYHtyLCBlY2hvID0gRiwgbWVzc2FnZSA9IEZ9CnNvdXJjZSgiLi9zY3JpcHRzL2RlcGVuZGVuY2llcy5SIikKc291cmNlKCIuL3NjcmlwdHMvY3VzdG9tX2Z1bnMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Zhcl9yZWNvZGVfY29udHJhc3QuUiIpCmBgYAoKYGBge3IgZGF0YX0KIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBhZHVsdHMKZF91c19hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF91c19hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfZ2hfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX3RoX2FkdWx0cyA8LSByZWFkX2NzdigiLi4vZGF0YS9kX3RoX2FkdWx0cy5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9jaF9hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9jaF9hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdnRfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdnRfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQoKIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBjaGlsZHJlbgpkX3VzX2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdXNfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9naF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF90aF9jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX3RoX2NoaWxkcmVuLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX2NoX2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfY2hfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdnRfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF92dF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkgJT4lCiAgIyBmaWx0ZXIgb3V0IHBhcnRpY2lwYW50cyBvdXRzaWRlIG9mIHRoZSBhZ2UgcmFuZ2UKICBmaWx0ZXIoKGFnZSA+PSA2ICYgYWdlIDw9IDEyKSB8IGlzLm5hKGFnZSkpCmBgYAoKYGBge3IgcmVjb2RlfQojIHJlY29kZSBraW5kYSA9IHllczogYWR1bHRzCmRfdXNfYWR1bHRzIDwtIGRfdXNfYWR1bHRzICU+JSAKICBtdXRhdGUocmVzcG9uc2UgPSBhcy5udW1lcmljKGdzdWIoMC41LCAxLCByZXNwb25zZSkpKQpkX2doX2FkdWx0cyA8LSBkX2doX2FkdWx0cyAlPiUgCiAgbXV0YXRlKHJlc3BvbnNlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgMSwgcmVzcG9uc2UpKSkKZF90aF9hZHVsdHMgPC0gZF90aF9hZHVsdHMgJT4lIAogIG11dGF0ZShyZXNwb25zZSA9IGFzLm51bWVyaWMoZ3N1YigwLjUsIDEsIHJlc3BvbnNlKSkpCmRfY2hfYWR1bHRzIDwtIGRfY2hfYWR1bHRzICU+JSAKICBtdXRhdGUocmVzcG9uc2UgPSBhcy5udW1lcmljKGdzdWIoMC41LCAxLCByZXNwb25zZSkpKQpkX3Z0X2FkdWx0cyA8LSBkX3Z0X2FkdWx0cyAlPiUgCiAgbXV0YXRlKHJlc3BvbnNlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgMSwgcmVzcG9uc2UpKSkKCiMgcmVjb2RlIGtpbmRhID0geWVzLCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBjaGlsZHJlbgpkX3VzX2NoaWxkcmVuIDwtIGRfdXNfY2hpbGRyZW4gJT4lIAogIG11dGF0ZShyZXNwb25zZSA9IGFzLm51bWVyaWMoZ3N1YigwLjUsIDEsIHJlc3BvbnNlKSkpCmRfZ2hfY2hpbGRyZW4gPC0gZF9naF9jaGlsZHJlbiAlPiUgCiAgbXV0YXRlKHJlc3BvbnNlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgMSwgcmVzcG9uc2UpKSkKIyBkX2doX2VuZ19jaGlsZHJlbiA8LSBkX2doX2VuZ19jaGlsZHJlbiAlPiUKIyBtdXRhdGUocmVzcG9uc2UgPSBhcy5udW1lcmljKGdzdWIoMC41LCAxLCByZXNwb25zZSkpKQpkX3RoX2NoaWxkcmVuIDwtIGRfdGhfY2hpbGRyZW4gJT4lIAogIG11dGF0ZShyZXNwb25zZSA9IGFzLm51bWVyaWMoZ3N1YigwLjUsIDEsIHJlc3BvbnNlKSkpCmRfY2hfY2hpbGRyZW4gPC0gZF9jaF9jaGlsZHJlbiAlPiUgCiAgbXV0YXRlKHJlc3BvbnNlID0gYXMubnVtZXJpYyhnc3ViKDAuNSwgMSwgcmVzcG9uc2UpKSkKZF92dF9jaGlsZHJlbiA8LSBkX3Z0X2NoaWxkcmVuICU+JSAKICBtdXRhdGUocmVzcG9uc2UgPSBhcy5udW1lcmljKGdzdWIoMC41LCAxLCByZXNwb25zZSkpKQpgYGAKCmBgYHtyIHdpZGV9CiMgbWFrZSB3aWRlLWZvcm0gZGF0YXNldHMgZm9yIEVGQTogYWR1bHRzCmRfdXNfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF91c19hZHVsdHMpCmRfZ2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9hZHVsdHMpCmRfdGhfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9hZHVsdHMpCmRfY2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9jaF9hZHVsdHMpCmRfdnRfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF92dF9hZHVsdHMpCgojIG1ha2Ugd2lkZS1mb3JtIGRhdGFzZXRzIGZvciBFRkE6IGNoaWxkcmVuCmRfdXNfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3VzX2NoaWxkcmVuKQpkX2doX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9jaGlsZHJlbikKIyBkX2doX2VuZ19jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfZ2hfZW5nX2NoaWxkcmVuKQpkX3RoX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9jaGlsZHJlbikKZF9jaF9jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfY2hfY2hpbGRyZW4pCmRfdnRfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3Z0X2NoaWxkcmVuKQpgYGAKCgojIEFkdWx0cwoKIyMgU2FtcGxlcwoKYGBge3Igc2FtcGxlcyBhZHVsdHN9CmJpbmRfcm93cyhkX3VzX2FkdWx0cywgZF9naF9hZHVsdHMsIGRfdGhfYWR1bHRzLCBkX2NoX2FkdWx0cywgZF92dF9hZHVsdHMpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCkgJT4lCiAgY291bnQoY291bnRyeSkgJT4lCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCkKYGBgCgojIyBGYWN0b3IgcmV0ZW50aW9uOiBwYXJhbGxlbCBhbmFseXNpcwoKYGBge3IgcGFyYWxsZWwgZGlzdCBhZHVsdHMsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAwLjV9CiMgTk9URTogSGVyZSBpcyBkaXN0cmlidXRpb24gb3ZlciBvdXRjb21lcyBvZiBwYXJhbGxlbCBhbmFseXNpcyB3aXRoIDEwMCBpdGVyYXRpb25zLiBXZSdsbCBjaG9vc2UgdGhlIG1lZGlhbiBudW1iZXIgb2YgZmFjdG9ycy4KCmlmIChmaWxlLmV4aXN0cygiLi4vcmVzdWx0cy9wYV9vdXRjb21lc19kaXN0X2FkdWx0c190ZXQuUkRTIikpIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2FkdWx0cyA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfYWR1bHRzX3RldC5SRFMiKQogIAp9IGVsc2UgewogIAogIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzIDwtIGRhdGEuZnJhbWUodXMgPSBOVUxMLCBnaCA9IE5VTEwsIHRoID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gTlVMTCwgdnQgPSBOVUxMKQogIAogIHNldC5zZWVkKDU0MzIxKQogIG5fY29yZXMgPC0gcGFyYWxsZWw6OmRldGVjdENvcmVzKCkKICBvcHRpb25zKG1jLmNvcmVzID0gbl9jb3JlcykKICAKICBmb3IgKGkgaW4gMToxMDApIHsKICAgIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzW2ksICJ1cyJdIDwtIGZhLnBhcmFsbGVsKGRfdXNfYWR1bHRzX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgImdoIl0gPC0gZmEucGFyYWxsZWwoZF9naF9hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0ICAgICAKICAgIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzW2ksICJ0aCJdIDwtIGZhLnBhcmFsbGVsKGRfdGhfYWR1bHRzX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgImNoIl0gPC0gZmEucGFyYWxsZWwoZF9jaF9hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAidnQiXSA8LSBmYS5wYXJhbGxlbChkX3Z0X2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QKICB9CiAgCiAgc2F2ZVJEUyhwYV9vdXRjb21lc19kaXN0X2FkdWx0cywgZmlsZSA9ICIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfYWR1bHRzX3RldC5SRFMiKQp9CgojIHBsb3QKcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJpdGVyIikgJT4lCiAgZ2F0aGVyKGNvdW50cnksIG5mYWN0LCAtaXRlcikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaCIsICJ0aCIsICJjaCIsICJ2dCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbmZhY3QpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnkpICsKICBnZW9tX2JhcihzdGF0ID0gImNvdW50IikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDEsIG1heChwYV9vdXRjb21lc19kaXN0X2FkdWx0cykgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEwMCwgMSkpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIGZhY3RvcnMgc3VnZ2VzdGVkIGJ5IGZhLnBhcmFsbGVsKCkiKQpgYGAKCiMjIEV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcwoKYGBge3IgZWZhIGFkdWx0c30Kc2V0LnNlZWQoNTQzMjEpCgojIGRvIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpczogYWR1bHRzCmVmYV91c19hZHVsdHMgPC0gZmFfZnVuKGRfdXNfYWR1bHRzX3csCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkdXMpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJ1c0FEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV91c19hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX2doX2FkdWx0cyA8LSBmYV9mdW4oZF9naF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkZ2gpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX2doX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJnaEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9naF9hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX3RoX2FkdWx0cyA8LSBmYV9mdW4oZF90aF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkdGgpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3RoX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJ0aEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV90aF9hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX2NoX2FkdWx0cyA8LSBmYV9mdW4oZF9jaF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkY2gpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX2NoX2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJjaEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MpKQoKZWZhX3Z0X2FkdWx0cyA8LSBmYV9mdW4oZF92dF9hZHVsdHNfdywgCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMkdnQpLAogICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3Z0X2FkdWx0cyRsb2FkaW5ncykgPC0gcGFzdGUwKCJ2dEFEVUxUU18iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV92dF9hZHVsdHMkbG9hZGluZ3MpKQpgYGAKCmBgYHtyIGZhY3RvciBuYW1lcyBhZHVsdHN9CmZhY3Rvcl9uYW1lc19hZHVsdHMgPC0gZGF0YS5mcmFtZShmYWN0b3IgPSBjKGNvbG5hbWVzKGVmYV91c19hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3RoX2FkdWx0cyRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSkpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSAiYWR1bHRzIikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBjYXNlX3doZW4oZ3JlcGwoIl51cyIsIGZhY3RvcikgfiAiVVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeZ2giLCBmYWN0b3IpIH4gIkdoYW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnRoIiwgZmFjdG9yKSB+ICJUaGFpbGFuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl5jaCIsIGZhY3RvcikgfiAiQ2hpbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJednQiLCBmYWN0b3IpIH4gIlZhbnVhdHUiKSwKICAgICAgICAgY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHNfY291bnRyeSkpICU+JQogIG11dGF0ZShmYWN0b3JfbmFtZSA9IGdzdWIoIl51cyIsICJVUyAiLCBmYWN0b3IpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl5naCIsICJHaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl50aCIsICJUaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl5jaCIsICJDaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl52dCIsICJWYS4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIkFEVUxUUyIsICJhZHVsdHMiLCBmYWN0b3JfbmFtZSksCiAgICAgICAgIGZhY3Rvcl9uYW1lID0gZ3N1YigiX0YiLCAiIEZhY3RvciAiLCBmYWN0b3JfbmFtZSkpICU+JQogIG11dGF0ZShmYWN0b3JfZGVzY3JpcHQgPSByZWNvZGUoZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNBRFVMVFNfRjEgPSAiQm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0FEVUxUU19GMiA9ICJIZWFydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0FEVUxUU19GMyA9ICJNaW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQURVTFRTX0YxID0gIklubmVyIHNwaGVyZSAobWluZC1saWtlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaEFEVUxUU19GMiA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hBRFVMVFNfRjMgPSAiSW50ZXJwZXJzb25hbCwgcmVsaWdpb3VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQURVTFRTX0YxID0gIkJvZHktbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aEFEVUxUU19GMiA9ICJIZWFydC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQURVTFRTX0YzID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEFEVUxUU19GMSA9ICJIZWFydC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQURVTFRTX0YyID0gIkJvZHktbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEFEVUxUU19GMyA9ICJNaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRBRFVMVFNfRjEgPSAiSGFybW9ueSAobWluZC1saWtlLCBoZWFydC1saWtlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dEFEVUxUU19GMiA9ICJTaW4gKGJvZHktbGlrZSkiKSwKICAgICAgICAgZmFjdG9yX2xhYmRlc2NyaXB0ID0gcGFzdGUoZ3N1YigiLipfRiIsICJGIiwgZmFjdG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2Rlc2NyaXB0LCBzZXAgPSAiOiAiKSkKYGBgCgojIyBGYWN0b3IgbG9hZGluZ3MKCmBgYHtyIG9yZGVyIGFkdWx0c30KIyBvcmRlciBjYXBhY2l0aWVzOiBhZHVsdHMKb3JkZXJfdXNfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX3VzX2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl9naF9hZHVsdHMgPC0gZmEuc29ydChlZmFfZ2hfYWR1bHRzKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX3RoX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV90aF9hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfY2hfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX2NoX2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl92dF9hZHVsdHMgPC0gZmEuc29ydChlZmFfdnRfYWR1bHRzKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCmBgYAoKYGBge3IgbG9hZGluZ3MgYWR1bHRzfQojIGNvbXBpbGUgbG9hZGluZ3M6IGFkdWx0cwpsb2FkaW5nc19hZHVsdHMgPC0gYmluZF9yb3dzKAogIGxvYWRpbmdzX2Z1bihlZmFfdXNfYWR1bHRzKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiVVMiKSwKICBsb2FkaW5nc19mdW4oZWZhX2doX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIkdoYW5hIiksCiAgbG9hZGluZ3NfZnVuKGVmYV90aF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJUaGFpbGFuZCIpLAogIGxvYWRpbmdzX2Z1bihlZmFfY2hfYWR1bHRzKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiQ2hpbmEiKSwKICBsb2FkaW5nc19mdW4oZWZhX3Z0X2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlZhbnVhdHUiKSkgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpLAogICAgICAgICBjYXBhY2l0eV9vcmRfdXMgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3VzX2FkdWx0cyksCiAgICAgICAgIGNhcGFjaXR5X29yZF9naCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfZ2hfYWR1bHRzKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3RoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl90aF9hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfY2ggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX2NoX2FkdWx0cyksCiAgICAgICAgIGNhcGFjaXR5X29yZF92dCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdnRfYWR1bHRzKSkgJT4lCiAgYXJyYW5nZShjb3VudHJ5LCBmYWN0b3IsIGRlc2MoYWJzKGxvYWRpbmcpKSwgY2FwYWNpdHkpICU+JQogIG11dGF0ZShvcmRlciA9IDE6bnJvdyguKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMpCmBgYAoKYGBge3IgaGVhdG1hcCBhZHVsdHMsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CiMgbWFrZSBoZWF0bWFwIGZpZ3VyZTogYWR1bHRzCmxvYWRpbmdzX2FkdWx0cyAlPiUKICBtdXRhdGUoZmFjdG9yX251bSA9IGFzLm51bWVyaWMoZ3N1YigiLipGIiwgIiIsIGZhY3RvcikpKSAlPiUKICBtdXRhdGUoc2FtcGxlID0gcGFzdGUoY291bnRyeSwgImFkdWx0cyIsIHNlcCA9ICJcbiIpKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cykgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdCwgZmFjdG9yX251bSksIAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3VzKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9lYykpLCAKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2doKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF90aCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfY2gpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3Z0KSksCiAgICAgICAgICAgICBmaWxsID0gbG9hZGluZykpICsKICBmYWNldF9ncmlkKH4gcmVvcmRlcihzYW1wbGUsIGFzLm51bWVyaWMoY291bnRyeSkpLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gMjAsIGJhcndpZHRoID0gMC41KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC44LCAibGluZXMiKSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiQ2FwYWNpdHkiLCBmaWxsID0gIkZhY3RvclxubG9hZGluZyIpCmBgYAoKIyMgQ29uZ3J1ZW5jZQoKYGBge3IgY29uZ3J1ZW5jZSBhZHVsdHN9CmNvbmdfYWR1bHRzIDwtIGZhLmNvbmdydWVuY2UoeCA9IGxpc3QoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV90aF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSA1KSAlPiUKICAjIGdldF91cHBlcl90cmlfZnVuKCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKSAlPiUKICBnYXRoZXIoZmFjdG9yX0IsIGNvbmcsIC1mYWN0b3JfQSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgIHJlbmFtZV9hbGwobGlzdCh+IChwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSkpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICByZW5hbWVfYWxsKGxpc3QofiAocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpKQpgYGAKCmBgYHtyIHRvcCBtYXRjaCBhZHVsdHN9CmNvbmdfYWR1bHRzX3RvcF9tYXRjaF9BIDwtIHRvcF9tYXRjaF9mdW4oY29uZ19hZHVsdHMsICJjb3VudHJ5X0EiKQpjb25nX2FkdWx0c190b3BfbWF0Y2hfQiA8LSB0b3BfbWF0Y2hfZnVuKGNvbmdfYWR1bHRzLCAiY291bnRyeV9CIikKYGBgCgpgYGB7ciBjb25nIGFsbCBwYWlycyBhZHVsdHMsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CmNvbmdfYWR1bHRzICU+JQogIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgIGZ1bnMoZ3N1YigiIFxcKCIsICJcblxcKCIsIC4pKSkgJT4lCiAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgZnVucyhnc3ViKCJcXC8iLCAiXFwvXG4iLCAuKSkpICU+JQogICMgbGVmdF9qb2luKGNvbmdfYWR1bHRzX3RvcF9tYXRjaF9BICU+JSByZW5hbWUodG9wX21hdGNoX0EgPSB0b3BfbWF0Y2gpKSAlPiUKICBsZWZ0X2pvaW4oY29uZ19hZHVsdHNfdG9wX21hdGNoX0IgJT4lIHJlbmFtZSh0b3BfbWF0Y2hfQiA9IHRvcF9tYXRjaCkpICU+JQogIG11dGF0ZShpc190b3BfbWF0Y2ggPSBjYXNlX3doZW4oZmFjdG9yX0EgPT0gZmFjdG9yX0IgfiAiYm9sZC5pdGFsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmYWN0b3JfQSA9PSB0b3BfbWF0Y2hfQSB+ICJib2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9CID09IHRvcF9tYXRjaF9CIH4gImJvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJwbGFpbiIpKSAlPiUKICAjIG11dGF0ZShjb25nID0gaWZlbHNlKGNvbmcgPT0gMSwgTkFfcmVhbF8sIGNvbmcpKSAlPiUKICBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZSh0b3VwcGVyKGNvdW50cnlfQSksICJhZHVsdHMiLCBzZXAgPSAiOlxuIikpICU+JQogIG11dGF0ZShzYW1wbGVfQiA9IHBhc3RlKHRvdXBwZXIoY291bnRyeV9CKSwgImFkdWx0cyIsIHNlcCA9ICI6XG4iKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoY291bnRyeV9BLCBjb3VudHJ5X0IpLAogICAgICAgICAgICBmdW5zKGZhY3Rvcih0b3VwcGVyKC4pLCBsZXZlbHMgPSB0b3VwcGVyKGxldmVsc19jb3VudHJ5KSkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3JfbGFiZGVzY3JpcHRfQSwKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBkZXNjKGZhY3Rvcl9sYWJkZXNjcmlwdF9CKSksCiAgICAgICAgICAgICBmaWxsID0gY29uZykpICsKICBmYWNldF9ncmlkKHJlb3JkZXIoc2FtcGxlX0IsIGFzLm51bWVyaWMoY291bnRyeV9CKSkgfiAKICAgICAgICAgICAgICAgcmVvcmRlcihzYW1wbGVfQSwgYXMubnVtZXJpYyhjb3VudHJ5X0EpKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjYXNlX3doZW4oaXMubmEoY29uZykgfiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBmb3JtYXQocm91bmQoY29uZywgMiksIG5zbWFsbCA9IDIpKSwKICAgICAgICAgICAgICAgIGZvbnRmYWNlID0gaXNfdG9wX21hdGNoLAogICAgICAgICAgICAgICAgY29sb3IgPSBpc190b3BfbWF0Y2gpLAogICAgICAgICAgICBzaXplID0gMywgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtyZWQiLCAiZGFya2JsdWUiLCAiYmxhY2siKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJ2aXJpZGlzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDI1LCBiYXJoZWlnaHQgPSAwLjUpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSBleHByZXNzaW9uKGl0YWxpYyhyW2NdKSkpCmBgYAoKIyMgQm9vdHN0cmFwcGVkIGNvbmdydWVuY2UKCmBgYHtyIGJvb3RzdHJhcCBjb25ncnVlbmNlIGFkdWx0c30KaWYgKGZpbGUuZXhpc3RzKCIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzX29ibGlxdWVfdGV0LlJEUyIpKSB7CiAgCiAgY29uZ19kZl9hZHVsdHMgPC0gcmVhZFJEUygiLi4vcmVzdWx0cy9jb25nX2RmX2FkdWx0c19vYmxpcXVlX3RldC5SRFMiKQogIAp9IGVsc2UgewogIAogIGJzX2FkdWx0cyA8LSBsb2FkaW5nc19hZHVsdHMgJT4lCiAgICBzZWxlY3QoY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBzcHJlYWQoZmFjdG9yLCBsb2FkaW5nKSAlPiUKICAgIHNlbGVjdCgtY2FwYWNpdHkpICU+JQogICAgc2pzdGF0czo6Ym9vdHN0cmFwKDEwMDApIAogIAogIGZhY3RvcnMgPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19hZHVsdHMkZmFjdG9yKSkKICAKICBjb25nX2RmX2FkdWx0cyA8LSBkYXRhLmZyYW1lKE5VTEwpCiAgZm9yIChpIGluIGZhY3RvcnMpIHsKICAgIGZvciAoaiBpbiBmYWN0b3JzKSB7CiAgICAgIGNuYW1lIDwtIHBhc3RlKGksIGosIHNlcCA9ICIuIikKICAgICAgdGVtcCA8LSBic19hZHVsdHMgJT4lCiAgICAgICAgbXV0YXRlKGNvbmcgPSBtYXBfZGJsKHN0cmFwLCB+bHNhOjpjb3NpbmUoYXMuZGF0YS5mcmFtZSgueClbLGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoLngpWyxqXSkpKQogICAgICBjb25nX2RmX2FkdWx0c1sxOjEwMDAsIGNuYW1lXSA8LSB0ZW1wJGNvbmcKICAgIH0KICB9CiAgCiAgY29uZ19kZl9hZHVsdHMgPC0gY29uZ19kZl9hZHVsdHMgJT4lCiAgICBnYXRoZXIoZmFjdG9yX3BhaXIsIGNvbmcpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGludG8gPSBjKCJmYWN0b3JfQSIsICJmYWN0b3JfQiIpLCBzZXAgPSAiXFwuIikgJT4lCiAgICBncm91cF9ieShmYWN0b3JfQSwgZmFjdG9yX0IpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGNvbmcpLAogICAgICAgICAgICAgIGNpX2xvd2VyID0gY2lfbG93ZXIoY29uZyksCiAgICAgICAgICAgICAgY2lfdXBwZXIgPSBjaV91cHBlcihjb25nKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSkgJT4lCiAgICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSkKICAKICBybShpLCBqLCBjbmFtZSwgdGVtcCwgZmFjdG9ycykKICAKICBzYXZlUkRTKGNvbmdfZGZfYWR1bHRzLCBmaWxlID0gIi4uL3Jlc3VsdHMvY29uZ19kZl9hZHVsdHNfb2JsaXF1ZV90ZXQuUkRTIikKfQpgYGAKCmBgYHtyIGNvbmcgbWluIGFkdWx0c30KIyBmaW5kIG1pbmltdW0gdmFsdWUgdG8gc2V0IGNvbnN0YW50IGxvd2VyIGJvdW5kIG9mIHBsb3RzCm1pbl9jb25nX2FkdWx0cyA8LSBjb25nX2RmX2FkdWx0cyAlPiUKICBzdW1tYXJpc2UobWluX2NvbmcgPSBtaW4oY2lfbG93ZXIsIG5hLnJtID0gVCkpCmBgYAoKYGBge3IgY29uZyBjaXMgdXMgYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIDMKY29uZ19wbG90X2Z1bihjb25nX2RmID0gY29uZ19kZl9hZHVsdHMsIHdoaWNoX2NvdW50cnkgPSAiVVMiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpICsKICAjIHlsaW0oTkEsIDEpICsKICBsYWJzKHggPSBOVUxMKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDNfb2JsaXF1ZS5wbmciKQpgYGAKCmBgYHtyIGNvbmcgY2lzIGdoIGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSBTMQpjb25nX3Bsb3RfZnVuKGNvbmdfZGYgPSBjb25nX2RmX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICAgICAgICAgICAgICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgICAgICAgICAgICAgICBmdW5zKGdzdWIoIiBcXCgiLCAiXG5cXCgiLCAuKSkpICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXFwvIiwgIlxcL1xuIiwgLikpKSwgCiAgICAgICAgICAgICAgd2hpY2hfY291bnRyeSA9ICJHaGFuYSIpICsKICB5bGltKG1pbl9jb25nX2FkdWx0cyRtaW5fY29uZywgMSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwMV9vYmxpcXVlLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgdGggYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFMyCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIlRoYWlsYW5kIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzAyX29ibGlxdWUucG5nIikKYGBgCgpgYGB7ciBjb25nIGNpcyBjaCBiYXNlIGFkdWx0cywgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuOX0KIyBGSUdVUkUgUzMKY29uZ19wbG90X2Z1bihjb25nX2RmID0gY29uZ19kZl9hZHVsdHMsIAogICAgICAgICAgICAgIHdoaWNoX2NvdW50cnkgPSAiQ2hpbmEiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDNfb2JsaXF1ZS5wbmciKQpgYGAKCmBgYHtyIGNvbmcgY2lzIHZ0IGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSBTNApjb25nX3Bsb3RfZnVuKGNvbmdfZGYgPSBjb25nX2RmX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICAgICAgICAgICAgICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgICAgICAgICAgICAgICBmdW5zKGdzdWIoIiBcXCgiLCAiXG5cXCgiLCAuKSkpICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXFwvIiwgIlxcL1xuIiwgLikpKSwgCiAgICAgICAgICAgICAgd2hpY2hfY291bnRyeSA9ICJWYW51YXR1IikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA0X29ibGlxdWUucG5nIikKYGBgCgpgYGB7ciBib2R5IG1pbmQgY29uZyBhZHVsdHN9CiMgIkluIGVhY2ggc2FtcGxlLCB0aGVyZSB3YXMgYSBmYWN0b3IgdGhhdCB3YXMgc2ltaWxhciB0byBVUyBhZHVsdHPigJkg4oCcYm9keeKAnSBmYWN0b3IuLi4KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCgojICIuLi5hbmQgbm90IHNpbWlsYXIgdG8gdGhlIFVTIGFkdWx0IOKAnG1pbmTigJ0gZmFjdG9yLCAuLi4KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCgojICIuLi4gYW5kIGEgZmFjdG9yIHRoYXQgd2FzIG11Y2ggbW9yZSBzaW1pbGFyIHRvIFVTIGFkdWx0c+KAmSDigJxtaW5k4oCdIGZhY3Rvci4uLgpjb25nX2RmX2FkdWx0cyAlPiUgCiAgZmlsdGVyKGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpLCAKICAgICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAhPSAiVVMiLCBjb3VudHJ5X0IgPT0gIlVTIikKCiMgIi4uLnRoYW4gdGhlIFVTIGFkdWx0IOKAnGJvZHnigJ0gZmFjdG9yLiIKY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCmBgYApgYGB7ciBoZWFydCBjb25nIGFkdWx0c30KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksIAogICAgICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAlaW4lIGMoIlRoYWlsYW5kIiwgIkNoaW5hIiksIGNvdW50cnlfQiA9PSAiVVMiKQoKY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSB8IAogICAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpLAogICAgICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAlaW4lIGMoIlRoYWlsYW5kIiwgIkNoaW5hIiksIGNvdW50cnlfQiA9PSAiVVMiKQpgYGAKCgojIENoaWxkcmVuCgojIyBTYW1wbGVzCgpgYGB7ciBzYW1wbGVzIGNoaWxkcmVufQpiaW5kX3Jvd3MoZF91c19jaGlsZHJlbiwgZF9naF9jaGlsZHJlbiwgZF90aF9jaGlsZHJlbiwgZF9jaF9jaGlsZHJlbiwgZF92dF9jaGlsZHJlbikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkKSAlPiUKICBjb3VudChjb3VudHJ5KSAlPiUgCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCkKYGBgCgojIyBGYWN0b3IgcmV0ZW50aW9uOiBwYXJhbGxlbCBhbmFseXNpcwoKYGBge3IgcGFyYWxsZWwgZGlzdCBjaGlsZHJlbiwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNX0KIyBIZXJlJ3MgdGhlIGRpc3RyaWJ1dGlvbiBvdmVyIG91dGNvbWVzIG9mIHBhcmFsbGVsIGFuYWx5c2lzIHdpdGggMTAwIGl0ZXJhdGlvbnMuIFdlJ2xsIGNob29zZSB0aGUgbWVkaWFuIG51bWJlciBvZiBmYWN0b3JzLgoKaWYgKGZpbGUuZXhpc3RzKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW5fdGV0LlJEUyIpKSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW5fdGV0LlJEUyIpCiAgCn0gZWxzZSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiA8LSBkYXRhLmZyYW1lKHVzID0gTlVMTCwgZ2ggPSBOVUxMLCB0aCA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gTlVMTCwgdnQgPSBOVUxMKQogIAogIHNldC5zZWVkKDU0MzIxKQogIG5fY29yZXMgPC0gcGFyYWxsZWw6OmRldGVjdENvcmVzKCkKICBvcHRpb25zKG1jLmNvcmVzID0gbl9jb3JlcykKICAKICBmb3IgKGkgaW4gMToxMDApIHsKICAgIHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW5baSwgInVzIl0gPC0gZmEucGFyYWxsZWwoZF91c19jaGlsZHJlbl93LCBwbG90ID0gRikkbmZhY3QKICAgIHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW5baSwgImdoIl0gPC0gZmEucGFyYWxsZWwoZF9naF9jaGlsZHJlbl93LCBwbG90ID0gRikkbmZhY3QgICAgIAogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAidGgiXSA8LSBmYS5wYXJhbGxlbChkX3RoX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAiY2giXSA8LSBmYS5wYXJhbGxlbChkX2NoX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAidnQiXSA8LSBmYS5wYXJhbGxlbChkX3Z0X2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdAogIH0KICAKICBzYXZlUkRTKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4sIGZpbGUgPSAiLi4vcmVzdWx0cy9wYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuX3RldC5SRFMiKQp9CgojIHBsb3QKcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiAlPiUKICByb3duYW1lc190b19jb2x1bW4oIml0ZXIiKSAlPiUKICBnYXRoZXIoY291bnRyeSwgbmZhY3QsIC1pdGVyKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoIiwgInRoIiwgImNoIiwgInZ0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBuZmFjdCkpICsKICBmYWNldF9ncmlkKH4gY291bnRyeSkgKwogIGdlb21fYmFyKHN0YXQgPSAiY291bnQiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMSwgbWF4KHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4pICsgMSksCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCAxMDAsIDEpKSArCiAgbGFicyh4ID0gIk51bWJlciBvZiBmYWN0b3JzIHN1Z2dlc3RlZCBieSBmYS5wYXJhbGxlbCgpIikKYGBgCgojIyBFeHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMKCmBgYHtyIGVmYSBjaGlsZHJlbn0Kc2V0LnNlZWQoNTQzMjEpCgojIGRvIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpczogY2hpbGRyZW4KZWZhX3VzX2NoaWxkcmVuIDwtIGZhX2Z1bihkX3VzX2NoaWxkcmVuX3csIAogICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiR1cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3VzX2NoaWxkcmVuJGxvYWRpbmdzKSA8LSBwYXN0ZTAoInVzQ0hJTERSRU5fIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV91c19jaGlsZHJlbiRsb2FkaW5ncykpCgplZmFfZ2hfY2hpbGRyZW4gPC0gZmFfZnVuKGRfZ2hfY2hpbGRyZW5fdywKICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kZ2gpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9uLml0ZXIgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV9naF9jaGlsZHJlbiRsb2FkaW5ncykgPC0gcGFzdGUwKCJnaENISUxEUkVOXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfY2hpbGRyZW4kbG9hZGluZ3MpKQoKZWZhX3RoX2NoaWxkcmVuIDwtIGZhX2Z1bihkX3RoX2NoaWxkcmVuX3csIAogICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiR0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX3RoX2NoaWxkcmVuJGxvYWRpbmdzKSA8LSBwYXN0ZTAoInRoQ0hJTERSRU5fIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV90aF9jaGlsZHJlbiRsb2FkaW5ncykpCgplZmFfY2hfY2hpbGRyZW4gPC0gZmFfZnVuKGRfY2hfY2hpbGRyZW5fdywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuJGNoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fcm90ID0gIm9ibGltaW4iKQpjb2xuYW1lcyhlZmFfY2hfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgiY2hDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2NoX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV92dF9jaGlsZHJlbiA8LSBmYV9mdW4oZF92dF9jaGlsZHJlbl93LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kdnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9uLml0ZXIgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV92dF9jaGlsZHJlbiRsb2FkaW5ncykgPC0gcGFzdGUwKCJ2dENISUxEUkVOXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfY2hpbGRyZW4kbG9hZGluZ3MpKQpgYGAKCmBgYHtyIGZhY3RvciBuYW1lcyBjaGlsZHJlbn0KZmFjdG9yX25hbWVzX2NoaWxkcmVuIDwtIGRhdGEuZnJhbWUoZmFjdG9yID0gYyhjb2xuYW1lcyhlZmFfdXNfY2hpbGRyZW4kbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9naF9jaGlsZHJlbiRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3RoX2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfY2hfY2hpbGRyZW4kbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV92dF9jaGlsZHJlbiRsb2FkaW5ncykpKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gImNoaWxkcmVuIikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBjYXNlX3doZW4oZ3JlcGwoIl51cyIsIGZhY3RvcikgfiAiVVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeZ2giLCBmYWN0b3IpIH4gIkdoYW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnRoIiwgZmFjdG9yKSB+ICJUaGFpbGFuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl5jaCIsIGZhY3RvcikgfiAiQ2hpbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJednQiLCBmYWN0b3IpIH4gIlZhbnVhdHUiKSwKICAgICAgICAgY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHNfY291bnRyeSkpICU+JQogIG11dGF0ZShmYWN0b3JfbmFtZSA9IGdzdWIoIl51cyIsICJVUyAiLCBmYWN0b3IpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl5naCIsICJHaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl50aCIsICJUaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl5jaCIsICJDaC4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl52dCIsICJWYS4gIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIkNISUxEUkVOIiwgImNoaWxkcmVuIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl9GIiwgIiBGYWN0b3IgIiwgZmFjdG9yX25hbWUpKSAlPiUKICBtdXRhdGUoZmFjdG9yX2Rlc2NyaXB0ID0gcmVjb2RlKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzQ0hJTERSRU5fRjEgPSAiQm9keS1saWtlLCBuZWdhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0NISUxEUkVOX0YzID0gIkhlYXJ0LWxpa2UsIHBvc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzQ0hJTERSRU5fRjIgPSAiTWluZC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQ0hJTERSRU5fRjEgPSAiQm9keS1saWtlLCBuZWdhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaENISUxEUkVOX0YyID0gIk1pbmQtbGlrZSwgcG9zaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hDSElMRFJFTl9GMyA9ICJQcmF5LCBhZGQsIGV0Yy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhDSElMRFJFTl9GMSA9ICJCb2R5LWxpa2UsIHBvc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjIgPSAiSGVhcnQtbGlrZSwgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhDSElMRFJFTl9GMyA9ICJNaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhDSElMRFJFTl9GNCA9ICJBZGQsIHByYXksIGV0Yy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDSElMRFJFTl9GMSA9ICJIZWFydC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ0hJTERSRU5fRjIgPSAiQm9keS1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ0hJTERSRU5fRjMgPSAiTWluZC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ0hJTERSRU5fRjQgPSAiUHJheSwgZXRjLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dENISUxEUkVOX0YxID0gIkJvZHktbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dENISUxEUkVOX0YyID0gIk1pbmQtbGlrZSwgcG9zaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRDSElMRFJFTl9GMyA9ICJIZWFydC1saWtlLCBuZWdhdGl2ZSIpLAogICAgICAgICBmYWN0b3JfbGFiZGVzY3JpcHQgPSBwYXN0ZShnc3ViKCIuKl9GIiwgIkYiLCBmYWN0b3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfZGVzY3JpcHQsIHNlcCA9ICI6ICIpKQpgYGAKCiMjIEZhY3RvciBsb2FkaW5ncwoKYGBge3Igb3JkZXIgY2hpbGRyZW59CiMgb3JkZXIgY2FwYWNpdGllczogY2hpbGRyZW4Kb3JkZXJfdXNfY2hpbGRyZW4gPC0gZmEuc29ydChlZmFfdXNfY2hpbGRyZW4pJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfZ2hfY2hpbGRyZW4gPC0gZmEuc29ydChlZmFfZ2hfY2hpbGRyZW4pJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfdGhfY2hpbGRyZW4gPC0gZmEuc29ydChlZmFfdGhfY2hpbGRyZW4pJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfY2hfY2hpbGRyZW4gPC0gZmEuc29ydChlZmFfY2hfY2hpbGRyZW4pJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfdnRfY2hpbGRyZW4gPC0gZmEuc29ydChlZmFfdnRfY2hpbGRyZW4pJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKYGBgCgpgYGB7ciBsb2FkaW5ncyBjaGlsZHJlbn0KIyBjb21waWxlIGxvYWRpbmdzOiBjaGlsZHJlbgpsb2FkaW5nc19jaGlsZHJlbiA8LSBiaW5kX3Jvd3MoCiAgbG9hZGluZ3NfZnVuKGVmYV91c19jaGlsZHJlbikgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlVTIiksCiAgbG9hZGluZ3NfZnVuKGVmYV9naF9jaGlsZHJlbikgJT4lIG11dGF0ZShjb3VudHJ5ID0gIkdoYW5hIiksCiAgbG9hZGluZ3NfZnVuKGVmYV90aF9jaGlsZHJlbikgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlRoYWlsYW5kIiksCiAgbG9hZGluZ3NfZnVuKGVmYV9jaF9jaGlsZHJlbikgJT4lIG11dGF0ZShjb3VudHJ5ID0gIkNoaW5hIiksCiAgbG9hZGluZ3NfZnVuKGVmYV92dF9jaGlsZHJlbikgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlZhbnVhdHUiKSkgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpLAogICAgICAgICBjYXBhY2l0eV9vcmRfdXMgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3VzX2NoaWxkcmVuKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX2doID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl9naF9jaGlsZHJlbiksCiAgICAgICAgIGNhcGFjaXR5X29yZF90aCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdGhfY2hpbGRyZW4pLAogICAgICAgICBjYXBhY2l0eV9vcmRfY2ggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX2NoX2NoaWxkcmVuKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3Z0ID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl92dF9jaGlsZHJlbikpICU+JQogIGFycmFuZ2UoY291bnRyeSwgZmFjdG9yLCBkZXNjKGFicyhsb2FkaW5nKSksIGNhcGFjaXR5KSAlPiUKICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfY2hpbGRyZW4pCmBgYAoKYGBge3IgaGVhdG1hcCBjaGlsZHJlbiwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuN30KIyBtYWtlIGhlYXRtYXAgZmlndXJlOiBjaGlsZHJlbgpsb2FkaW5nc19jaGlsZHJlbiAlPiUKICBtdXRhdGUoZmFjdG9yX251bSA9IGFzLm51bWVyaWMoZ3N1YigiLipGIiwgIiIsIGZhY3RvcikpKSAlPiUKICBtdXRhdGUoc2FtcGxlID0gcGFzdGUoY291bnRyeSwgImNoaWxkcmVuIiwgc2VwID0gIlxuIikpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfY2hpbGRyZW4pICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihmYWN0b3JfbGFiZGVzY3JpcHQsIGZhY3Rvcl9udW0pLCAKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF91cykpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfZWMpKSwgCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9naCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfdGgpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2NoKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF92dCkpLAogICAgICAgICAgICAgZmlsbCA9IGxvYWRpbmcpKSArCiAgZmFjZXRfZ3JpZCh+IHJlb3JkZXIoc2FtcGxlLCBhcy5udW1lcmljKGNvdW50cnkpKSwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSksIHNpemUgPSAzKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDIwLCBiYXJ3aWR0aCA9IDAuNSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBwYW5lbC5zcGFjaW5nLnggPSB1bml0KDAuOCwgImxpbmVzIiksCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIikpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIkNhcGFjaXR5IiwgZmlsbCA9ICJGYWN0b3JcbmxvYWRpbmciKQpgYGAKCiMjIENvbmdydWVuY2UKClNlZSBbQWxsIHNhbXBsZXNdLCBiZWxvdy4KCiMjIEJvb3RzdHJhcHBlZCBjb25ncnVlbmNlCgpgYGB7ciBib290c3RyYXAgY29uZ3J1ZW5jZSBjaGlsZHJlbn0KaWYgKGZpbGUuZXhpc3RzKCIuLi9yZXN1bHRzL2NvbmdfZGZfY2hpbGRyZW5fb2JsaXF1ZV90ZXQuUkRTIikpIHsKICAKICBjb25nX2RmX2NoaWxkcmVuIDwtIHJlYWRSRFMoIi4uL3Jlc3VsdHMvY29uZ19kZl9jaGlsZHJlbl9vYmxpcXVlX3RldC5SRFMiKQogIAp9IGVsc2UgewogIAogIGJzX2NoaWxkcmVuIDwtIGxvYWRpbmdzX2NoaWxkcmVuICU+JQogICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBmdWxsX2pvaW4obG9hZGluZ3NfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgICAgICAgICAgICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykpICU+JQogICAgc2VsZWN0KC1jYXBhY2l0eSkgJT4lCiAgICBzanN0YXRzOjpib290c3RyYXAoMTAwMCkgCiAgCiAgY29uZ19kZl9jaGlsZHJlbiA8LSBkYXRhLmZyYW1lKE5VTEwpCiAgCiAgZm9yIChrIGluIGxldmVsc19jb3VudHJ5KSB7CiAgICAKICAgIGZhY3RvcnNfY2hpbGRyZW4gPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19jaGlsZHJlbiRmYWN0b3JbCiAgICAgIGxvYWRpbmdzX2NoaWxkcmVuJGNvdW50cnkgPT0ga10pKQogICAgZmFjdG9yc19hZHVsdHMgPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19hZHVsdHMkZmFjdG9yWwogICAgICBsb2FkaW5nc19hZHVsdHMkY291bnRyeSA9PSBrXSkpCiAgICAKICAgIGZvciAoaSBpbiBmYWN0b3JzX2NoaWxkcmVuKSB7CiAgICAgIGZvciAoaiBpbiBmYWN0b3JzX2FkdWx0cykgewogICAgICAgIGNuYW1lIDwtIHBhc3RlKGksIGosIHNlcCA9ICIuIikKICAgICAgICB0ZW1wIDwtIGJzX2NoaWxkcmVuICU+JQogICAgICAgICAgbXV0YXRlKGNvbmcgPSBtYXBfZGJsKHN0cmFwLCB+bHNhOjpjb3NpbmUoYXMuZGF0YS5mcmFtZSgueClbLGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgueClbLGpdKSkpCiAgICAgICAgY29uZ19kZl9jaGlsZHJlblsxOjEwMDAsIGNuYW1lXSA8LSB0ZW1wJGNvbmcKICAgICAgfQogICAgfQogICAgCiAgICBybShpLCBqLCBjbmFtZSwgdGVtcCwgZmFjdG9yc19jaGlsZHJlbiwgZmFjdG9yc19hZHVsdHMpCiAgICAKICB9CiAgCiAgcm0oaykKICAKICBjb25nX2RmX2NoaWxkcmVuIDwtIGNvbmdfZGZfY2hpbGRyZW4gJT4lCiAgICBnYXRoZXIoZmFjdG9yX3BhaXIsIGNvbmcpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGludG8gPSBjKCJmYWN0b3JfQSIsICJmYWN0b3JfQiIpLCBzZXAgPSAiXFwuIikgJT4lCiAgICBncm91cF9ieShmYWN0b3JfQSwgZmFjdG9yX0IpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGNvbmcpLAogICAgICAgICAgICAgIGNpX2xvd2VyID0gY2lfbG93ZXIoY29uZyksCiAgICAgICAgICAgICAgY2lfdXBwZXIgPSBjaV91cHBlcihjb25nKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIGZ1bGxfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0EgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkJvZHktbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiTWluZC1saWtlXG5jaGlsZCBmYWN0b3IiLAogICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiSGVhcnQtbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0IgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkJvZHktbGlrZSBmYWN0b3IiLAogICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSB+ICJMb2NhbCBhZHVsdHM6XG5NaW5kLWxpa2UgZmFjdG9yIiwKICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkhlYXJ0LWxpa2UgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJMb2NhbCBhZHVsdHM6XG5PdGhlciBmYWN0b3IiKSkKICAKICBzYXZlUkRTKGNvbmdfZGZfY2hpbGRyZW4sIGZpbGUgPSAiLi4vcmVzdWx0cy9jb25nX2RmX2NoaWxkcmVuX29ibGlxdWVfdGV0LlJEUyIpCn0KYGBgCgpgYGB7ciBjb25nIG1pbiBjaGlsZHJlbn0KIyBmaW5kIG1pbmltdW0gdmFsdWUgdG8gc2V0IGNvbnN0YW50IGxvd2VyIGJvdW5kIG9mIHBsb3RzCm1pbl9jb25nX2NoaWxkcmVuIDwtIGNvbmdfZGZfY2hpbGRyZW4gJT4lCiAgc3VtbWFyaXNlKG1pbl9jb25nID0gbWluKGNpX2xvd2VyLCBuYS5ybSA9IFQpKQpgYGAKCmBgYHtyIGNvbmcgY2lzIGNoaWxkcmVuLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMS40fQojIEZJR1VSRSA0CiMgZmlnLmFzcCBjaG9zZW4gdG8ga2VlcCBhYnNvbHV0ZSBoZWlnaHQgb2YgeS1heGlzIHJlbGF0aXZlbHkgc2ltaWxhciBhY3Jvc3MgYWR1bHRzIGFuZCBjaGlsZHJlbgpjb25nX2RmX2NoaWxkcmVuICU+JQogIG11dGF0ZShyZWdpb25fQSA9IGNhc2Vfd2hlbigKICAgIGNvdW50cnlfQSA9PSAiVVMiIH4gIlNGIEJheSBBcmVhIiwKICAgIGNvdW50cnlfQSA9PSAiR2hhbmEiIH4gIkNhcGUgQ29hc3QiLAogICAgY291bnRyeV9BID09ICJUaGFpbGFuZCIgfiAiQ2hpYW5nIE1haSIsCiAgICBjb3VudHJ5X0EgPT0gIkNoaW5hIiB+ICJTaGFuZ2hhaSIsCiAgICBjb3VudHJ5X0EgPT0gIlZhbnVhdHUiIH4gIlBWICYgTWFsZWt1bGEiKSkgJT4lCiAgbXV0YXRlKHNhbXBsZV9BID0gcGFzdGUoY291bnRyeV9BLCBhZ2VfZ3JvdXBfQSwgc2VwID0gIlxuIikpICU+JQogIG11dGF0ZShsYWJfQSA9IHBhc3RlKHBhc3RlMChyZWdpb25fQSwgIiwiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKHRvdXBwZXIoY291bnRyeV9BKSwgIjoiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgYWdlX2dyb3VwX0EsIHNlcCA9ICJcbiIpKSAlPiUKICBtdXRhdGUoYmhtX0EgPSBjYXNlX3doZW4oCiAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2xhYmRlc2NyaXB0X0EpKSB+ICJib2R5IiwKICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfbGFiZGVzY3JpcHRfQSkpIH4gIm1pbmQiLAogICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfbGFiZGVzY3JpcHRfQSkpIH4gImhlYXJ0IiwgCiAgICBUUlVFIH4gIm90aGVyIikpICU+JQogIG11dGF0ZShiaG1fQSA9IGZhY3RvcihiaG1fQSwgbGV2ZWxzID0gYygiYm9keSIsICJoZWFydCIsICJtaW5kIiwgIm90aGVyIikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdF9BLCBhcy5udW1lcmljKGJobV9BKSksIHkgPSBtZWFuKSkgKwogIGZhY2V0X2dyaWQoZmFjdG9yX2JobV9CIH4gcmVvcmRlcihsYWJfQSwgYXMubnVtZXJpYyhjb3VudHJ5X0EpKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZV94IikgKwogICMgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSAwLjg1LAogICMgICAgICAgICAgZmlsbCA9ICJncmF5MjAiLCBhbHBoYSA9IDAuMikgKwogICMgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IDAuODUsIHltYXggPSAwLjk1LAogICMgICAgICAgICAgZmlsbCA9IHZpcmlkaXNMaXRlOjp2aXJpZGlzKDIsIGJlZ2luID0gMC43NS8yLCBlbmQgPSAwLjc1KVsxXSwgYWxwaGEgPSAwLjIpICsKICAjIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAwLjk1LCB5bWF4ID0gSW5mLAogICMgICAgICAgICAgZmlsbCA9IHZpcmlkaXNMaXRlOjp2aXJpZGlzKDIsIGJlZ2luID0gMC43NS8yLCBlbmQgPSAwLjc1KVsyXSwgYWxwaGEgPSAwLjIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjg1LCBsdHkgPSAyLCBjb2xvciA9ICJncmF5MTAiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC45NSwgbHR5ID0gMiwgY29sb3IgPSAiZ3JheTEwIikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSAzLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKG1lYW4sIDIpLCBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgIHkgPSBpZmVsc2UoY2lfbG93ZXIgPCAwLjIsIGNpX3VwcGVyICsgMC4wNSwgY2lfbG93ZXIgLSAwLjA1KSwKICAgICAgICAgICAgICAgIHZqdXN0ID0gaWZlbHNlKGNpX2xvd2VyIDwgMC4yLCAwLCAxKSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xLCAxLCAwLjIpLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBleHBhbnNpb24oYWRkID0gMC4wNSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGFlc3RoZXRpY3MgPSBjKCJjb2xvciIsICJmaWxsIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gMjE6MjUpICsKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9IGV4cHJlc3Npb24oIlNpbWlsYXJpdHkgIihpdGFsaWMocltjXSkpKSkgKyAKICBndWlkZXMoY29sb3IgPSAibm9uZSIsIGZpbGwgPSAibm9uZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLAogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gc2NhbGVzOjphbHBoYSgid2hpdGUiLCAwKSwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIiksIAogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDUuNSwgNS41LCA1LjUsIDE1LjUpLCAicG9pbnQiKSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzA0X29ibGlxdWUucG5nIikKYGBgCgpgYGB7ciBib2R5IG1pbmQgY29uZyBjaGlsZHJlbn0KIyAiSW4gZWFjaCBzYW1wbGUsIHRoZXJlIHdhcyBhIGZhY3RvciB0aGF0IHdhcyBtdWNoIG1vcmUgc2ltaWxhciB0byBsb2NhbCBhZHVsdHPigJkg4oCcYm9keS1saWtl4oCdIGZhY3Rvci4uLgpjb25nX2RmX2NoaWxkcmVuICU+JSAKICBmaWx0ZXIoZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQSkpLCAKICAgICAgICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQikpKQoKIyAiLi4udGhhbiB0aGVpciDigJxtaW5kLWxpa2XigJ0gZmFjdG9yLCAuLi4KY29uZ19kZl9jaGlsZHJlbiAlPiUgCiAgZmlsdGVyKGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfYmhtX0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfYmhtX0IpKSkKCiMgIi4uLiBhbmQgYSBmYWN0b3IgdGhhdCB3YXMgbXVjaCBtb3JlIHNpbWlsYXIgdG8gbG9jYWwgYWR1bHRz4oCZIOKAnG1pbmQtbGlrZeKAnSBmYWN0b3IuLi4KY29uZ19kZl9jaGlsZHJlbiAlPiUgCiAgZmlsdGVyKGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfYmhtX0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfYmhtX0IpKSkKCiMgIi4uLnRoYW4gdGhlaXIg4oCcYm9keS1saWtl4oCdIGZhY3Rvci4iCmNvbmdfZGZfY2hpbGRyZW4gJT4lIAogIGZpbHRlcihncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2JobV9BKSksIAogICAgICAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2JobV9CKSkpCmBgYAoKCiMgQWxsIHNhbXBsZXMKCiMjIENvbmdydWVuY2UKCmBgYHtyIGNvbmdydWVuY2UgYWxsIHNhbXBsZXN9CmNvbmdfYWxsIDwtIGZhLmNvbmdydWVuY2UoeCA9IGxpc3QoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV90aF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdnRfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV91c19jaGlsZHJlbiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfZ2hfY2hpbGRyZW4kbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3RoX2NoaWxkcmVuJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV9jaF9jaGlsZHJlbiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdnRfY2hpbGRyZW4kbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDUpICU+JQogICMgZ2V0X3VwcGVyX3RyaV9mdW4oKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfQSIpICU+JQogIGdhdGhlcihmYWN0b3JfQiwgY29uZywgLWZhY3Rvcl9BKSAlPiUKICBsZWZ0X2pvaW4oYmluZF9yb3dzKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSksCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSkpICU+JQogIGxlZnRfam9pbihiaW5kX3Jvd3MoZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpKSkKYGBgCgpgYGB7ciBjb25nIGFsbCBwYWlycyBmb3JtYXR9CiMgbWFrZSB3aWRlLWZvcm0gdmVyc2lvbiBvZiBkZgpjb25nX2FsbF93IDwtIGNvbmdfYWxsICU+JQogIHNlbGVjdChmYWN0b3JfQSwgZmFjdG9yX0IsIGNvbmcpICU+JQogIHNwcmVhZChmYWN0b3JfQiwgY29uZykgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJmYWN0b3JfQSIpCgojIHRyZWF0IHNpbWlsYXJpdHkgbWF0cml4IGFzIGlmIGl0IHdlcmUgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBmb3IgaGNsdXN0CnJvdy5vcmRlciA8LSBoY2x1c3QoYXMuZGlzdCgoMSAtIGNvbmdfYWxsX3cpLzIpKSRvcmRlcgpjb2wub3JkZXIgPC0gaGNsdXN0KGFzLmRpc3QodCgoMSAtIGNvbmdfYWxsX3cpLzIpKSkkb3JkZXIKCiMgcmUtb3JkZXIgbWF0cml4IGFjY29yaW5nIHRvIGNsdXN0ZXJpbmcKY29uZ19hbGxfdyA8LSBjb25nX2FsbF93W3Jvdy5vcmRlciwgY29sLm9yZGVyXSAKCiMgZm9yIHNvbWUgcmVhc29uIHJlc2hhcGUyOjptZWx0KCkgd29ya3MgYmV0dGVyIHRoYW4gY3VycmVudCB0aWR5dmVyc2UgZnVuY3Rpb25zLi4uCmNvbmdfYWxsX29yZGVyZWQgPC0gbWVsdChhcy5tYXRyaXgoY29uZ19hbGxfdykpICU+JQogIHJlbmFtZShmYWN0b3JfQV9vcmRlcmVkID0gVmFyMSwgCiAgICAgICAgIGZhY3Rvcl9CX29yZGVyZWQgPSBWYXIyLAogICAgICAgICBjb25nID0gdmFsdWUpICU+JQogIG11dGF0ZShmYWN0b3JfQSA9IGFzLmNoYXJhY3RlcihmYWN0b3JfQV9vcmRlcmVkKSwKICAgICAgICAgZmFjdG9yX0IgPSBhcy5jaGFyYWN0ZXIoZmFjdG9yX0Jfb3JkZXJlZCkpICU+JQogIGZ1bGxfam9pbihjb25nX2FsbCAlPiUgc2VsZWN0KGNvbnRhaW5zKCJfQSIpKSAlPiUgZGlzdGluY3QoKSkgJT4lCiAgZnVsbF9qb2luKGNvbmdfYWxsICU+JSBzZWxlY3QoY29udGFpbnMoIl9CIikpICU+JSBkaXN0aW5jdCgpKSAlPiUKICBtdXRhdGUobGFiX0EgPSBwYXN0ZShwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BKSwgZmFjdG9yX2xhYmRlc2NyaXB0X0EsIHNlcCA9ICIsICIpLAogICAgICAgICBsYWJfQiA9IHBhc3RlKHBhc3RlKGNvdW50cnlfQiwgYWdlX2dyb3VwX0IpLCBmYWN0b3JfbGFiZGVzY3JpcHRfQiwgc2VwID0gIiwgIikpCiMgbXV0YXRlKHNhbXBsZV9BID0gcGFzdGUoY291bnRyeV9BLCBhZ2VfZ3JvdXBfQSwgc2VwID0gIiwgIiksCiMgICAgICAgIHNhbXBsZV9CID0gcGFzdGUoY291bnRyeV9CLCBhZ2VfZ3JvdXBfQiwgc2VwID0gIiwgIiksCiMgICAgICAgIGxhYl9BID0gcGFzdGUoc2FtcGxlX0EsIGZhY3Rvcl9sYWJkZXNjcmlwdF9BLCBzZXAgPSAiICIpLAojICAgICAgICBsYWJfQiA9IHBhc3RlKHNhbXBsZV9CLCBmYWN0b3JfbGFiZGVzY3JpcHRfQiwgc2VwID0gIiAiKSkKYGBgCgpgYGB7ciBjb25nIGFsbCBwYWlycyBwbG90LCBmaWcud2lkdGggPSA5LjUsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIDIKY29uZ19sb3dlcl9saW0gPC0gaWZlbHNlKG1pbihjb25nX2FsbF9vcmRlcmVkJGNvbmcpID4gLTAuMDUsIC0wLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgIG1pbihjb25nX2FsbF9vcmRlcmVkJGNvbmcpKQojIGNvbmdfcGxvdF9jb2xvcnMgPC0gYygicmVkNCIsICJibHVlNCIsICJkYXJrb3JjaGlkNCIsICJibGFjayIpCiMgY29uZ19wbG90X2NvbG9ycyA8LSBjKCJibGFjayIsICJibGFjayIsICJibGFjayIsICJibGFjayIpCmNvbmdfcGxvdF9jb2xvcnMgPC0gYygicmVkNCIsICJyZWQ0IiwgInJlZDQiLCAiYmxhY2siKQoKY29uZ19hbGxfb3JkZXJlZCAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGxhYl9BLCBhcy5udW1lcmljKGZhY3Rvcl9BX29yZGVyZWQpKSwKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGxhYl9CLCBhcy5udW1lcmljKGRlc2MoZmFjdG9yX0Jfb3JkZXJlZCkpKSwKICAgICAgICAgICAgIGZpbGwgPSBjb25nKSkgKyAKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4yKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChjb25nLCAyKSwgbnNtYWxsID0gMiksCiAgICAgICAgICAgICAgICBjb2xvciA9IGNhc2Vfd2hlbihjb25nID4gMC44NSB+ICJhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25nID4gMC43NSB+ICJiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmcgPiAwLjY1IH4gImMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJkIikpLAogICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICAjICMgYm9keS1saWtlIGZhY3RvcnMKICAjIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDUuNSwgeG1heCA9IDE1LjUsIHltaW4gPSAxNi41LCB5bWF4ID0gMjYuNSwKICAjICAgICAgICAgIGNvbG9yID0gY29uZ19wbG90X2NvbG9yc1sxXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgIyAjIG1pbmQtbGlrZSBmYWN0b3JzCiAgIyBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxNS41LCB4bWF4ID0gMjUuNSwgeW1pbiA9IDYuNSwgeW1heCA9IDE2LjUsCiAgIyAgICAgICAgICBjb2xvciA9IGNvbmdfcGxvdF9jb2xvcnNbMl0sIHNpemUgPSAxLjUsIGFscGhhID0gMCkgKwogICMgIyBoZWFydC1saWtlIGZhY3RvcnMKICAjIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDI1LjUsIHhtYXggPSAzMS41LCB5bWluID0gMC41LCB5bWF4ID0gNi41LAogICMgICAgICAgICAgY29sb3IgPSBjb25nX3Bsb3RfY29sb3JzWzNdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjIHNjYWxlX2ZpbGxfdmlyaWRpc19jKHRyYW5zID0gc2NhbGVzOjpleHBfdHJhbnMoYmFzZSA9IGV4cCgxKSksCiAgIyAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKGNvbmdfbG93ZXJfbGltLCAxKSwgCiAgIyAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoY29uZ19sb3dlcl9saW0sIDEsIDAuMDUpLAogICMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYyhmb3JtYXQoc2VxKGNvbmdfbG93ZXJfbGltLCAwLjgsIDAuMDUpLCBuc21hbGwgPSAyKSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwgCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjk1ID0gaGlnaCIsICIxLjAwIiksCiAgIyAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAidmlyaWRpcyIsCiAgIyAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDQwKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKCN0cmFucyA9IHNjYWxlczo6ZXhwX3RyYW5zKGJhc2UgPSBleHAoMSkpLAogICAgbGltaXRzID0gYyhjb25nX2xvd2VyX2xpbSwgMSksIAogICAgYnJlYWtzID0gc2VxKGNvbmdfbG93ZXJfbGltLCAxLCAwLjA1KSwKICAgIGxhYmVscyA9IGMoZm9ybWF0KHNlcShjb25nX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgbnNtYWxsID0gMiksCiAgICAgICAgICAgICAgICIwLjg1ID0gbW9kZXJhdGUiLCAiMC45MCIsIAogICAgICAgICAgICAgICAiMC45NSA9IGhpZ2giLCAiMS4wMCIpLAogICAgY29sb3JzID0gdmlyaWRpc0xpdGU6OnZpcmlkaXMoNiksCiAgICB2YWx1ZXMgPSBjKDAsIDAuNjUsIDAuNzUsIDAuODUsIDAuOTUsIDEpLAogICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA0MCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siLCAiZ3JheTYwIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgICMgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEsCiAgICAgIGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICBzaXplID0gc2l6ZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgc2l6ZXMgPSBjKDIwLCAxNCkpLAogICAgICBjb2xvciA9IGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycyksCiAgICAgIGZhY2UgID0gZmFjZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSkpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSByZXYoc2l6ZV9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgc2l6ZXMgPSBjKDIwLCAxNCkpKSwKICAgICAgY29sb3IgPSByZXYoY29sb3JfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIGNvbG9yX2xpc3QgPSBjb25nX3Bsb3RfY29sb3JzKSksCiAgICAgIGZhY2UgID0gcmV2KGZhY2VfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EpKSksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDIwKSwKICAgICMgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShzaXplID0gMC41KSwKICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfbGluZSgKICAgICAgc2l6ZSA9IHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygxLjUsIDAuNSkpLAogICAgICBjb2xvciA9IGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycykpLAogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9saW5lKAogICAgICBzaXplID0gcmV2KHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygxLjUsIDAuNSkpKSwKICAgICAgY29sb3IgPSByZXYoY29sb3JfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIGNvbG9yX2xpc3QgPSBjb25nX3Bsb3RfY29sb3JzKSkpLAogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KDAuMjUsICJjbSIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSBleHByZXNzaW9uKGl0YWxpYyhyW2NdKSkpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwMl9vYmxpcXVlLnBuZyIpCmBgYAoKIyMgSmFjY2FyZCBTaW1pbGFyaXR5CgpgYGB7ciBqYWNjYXJkIGFsbCBzYW1wbGVzfQpzdHJvbmdfbG9hZF9hbGwgPC0gbG9hZGluZ3NfYWR1bHRzICU+JQogIGJpbmRfcm93cyhsb2FkaW5nc19jaGlsZHJlbikgJT4lCiAgc2VsZWN0KGNvdW50cnksIGFnZV9ncm91cCwgZmFjdG9yLCBjYXBhY2l0eSwgbG9hZGluZykgJT4lCiAgbXV0YXRlKHN0cm9uZ19sb2FkID0gaWZlbHNlKGxvYWRpbmcgPj0gMC41LCAxLCAwKSkgJT4lCiAgc2VsZWN0KC1sb2FkaW5nKQoKY3Jvc3NfbG9hZF9hbGwgPC0gc3Ryb25nX2xvYWRfYWxsICU+JQogIGZpbHRlcihzdHJvbmdfbG9hZCA9PSAxKSAlPiUKICBjb3VudChjb3VudHJ5LCBhZ2VfZ3JvdXAsIGNhcGFjaXR5LCBzdHJvbmdfbG9hZCkgJT4lCiAgZmlsdGVyKG4gPiAxKSAlPiUKICBtdXRhdGUoY3Jvc3NfbG9hZCA9IFQpICU+JQogIHNlbGVjdChjb3VudHJ5LCBhZ2VfZ3JvdXAsIGNhcGFjaXR5LCBjcm9zc19sb2FkKQoKc3Ryb25nX25vbmNyb3NzX2xvYWRfYWxsIDwtIHN0cm9uZ19sb2FkX2FsbCAlPiUKICBsZWZ0X2pvaW4oY3Jvc3NfbG9hZF9hbGwpICU+JQogIGZpbHRlcihpcy5uYShjcm9zc19sb2FkKSkKCmphY2NhcmRfYWxsIDwtIHN0cm9uZ19ub25jcm9zc19sb2FkX2FsbCAlPiUKICBzZWxlY3QoZmFjdG9yLCBjYXBhY2l0eSwgc3Ryb25nX2xvYWQpICU+JQogIHNwcmVhZChmYWN0b3IsIHN0cm9uZ19sb2FkKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoImNhcGFjaXR5IikgJT4lCiAgdCgpICU+JQogIGRpc3QobWV0aG9kID0gImJpbmFyeSIsIGRpYWcgPSBULCB1cHBlciA9IFQpICU+JQogIGFzLm1hdHJpeCgpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImZhY3Rvcl9BIikgJT4lCiAgZ2F0aGVyKGZhY3Rvcl9CLCBqYWNjYXJkLCAtZmFjdG9yX0EpICU+JQogICMgY29tcHV0ZSBzaW1pbGFyaXR5IGluZGV4IGluc3RlYWQgb2YgZGlzdGFuY2UKICBtdXRhdGUoamFjY2FyZCA9IDEgLSBqYWNjYXJkKSAlPiUKICBsZWZ0X2pvaW4oYmluZF9yb3dzKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSksCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSkpICU+JQogIGxlZnRfam9pbihiaW5kX3Jvd3MoZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpKSkKYGBgCgpgYGB7ciBqYWNjYXJkIGFsbCBwYWlycyBmb3JtYXR9CiMgbWFrZSB3aWRlLWZvcm0gdmVyc2lvbiBvZiBkZgpqYWNjYXJkX2FsbF93IDwtIGphY2NhcmRfYWxsICU+JQogIHNlbGVjdChmYWN0b3JfQSwgZmFjdG9yX0IsIGphY2NhcmQpICU+JQogIHNwcmVhZChmYWN0b3JfQiwgamFjY2FyZCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJmYWN0b3JfQSIpCgojIHRyZWF0IGRpc3RhbmNlIG1hdHJpeCBhcyBpZiBpdCB3ZXJlIHRoZSBjb3JyZWxhdGlvbiBtYXRyaXggZm9yIGhjbHVzdApyb3cub3JkZXIgPC0gaGNsdXN0KGFzLmRpc3QoKDEgLSBqYWNjYXJkX2FsbF93KS8yKSkkb3JkZXIKY29sLm9yZGVyIDwtIGhjbHVzdChhcy5kaXN0KHQoKDEgLSBqYWNjYXJkX2FsbF93KS8yKSkpJG9yZGVyCgojIHJlLW9yZGVyIG1hdHJpeCBhY2NvcmluZyB0byBjbHVzdGVyaW5nCmphY2NhcmRfYWxsX3cgPC0gamFjY2FyZF9hbGxfd1tyb3cub3JkZXIsIGNvbC5vcmRlcl0gCgojIGZvciBzb21lIHJlYXNvbiByZXNoYXBlMjo6bWVsdCgpIHdvcmtzIGJldHRlciB0aGFuIGN1cnJlbnQgdGlkeXZlcnNlIGZ1bmN0aW9ucy4uLgpqYWNjYXJkX2FsbF9vcmRlcmVkIDwtIG1lbHQoYXMubWF0cml4KGphY2NhcmRfYWxsX3cpKSAlPiUKICByZW5hbWUoZmFjdG9yX0Ffb3JkZXJlZCA9IFZhcjEsIAogICAgICAgICBmYWN0b3JfQl9vcmRlcmVkID0gVmFyMiwKICAgICAgICAgamFjY2FyZCA9IHZhbHVlKSAlPiUKICBtdXRhdGUoZmFjdG9yX0EgPSBhcy5jaGFyYWN0ZXIoZmFjdG9yX0Ffb3JkZXJlZCksCiAgICAgICAgIGZhY3Rvcl9CID0gYXMuY2hhcmFjdGVyKGZhY3Rvcl9CX29yZGVyZWQpKSAlPiUKICBmdWxsX2pvaW4oamFjY2FyZF9hbGwgJT4lIHNlbGVjdChjb250YWlucygiX0EiKSkgJT4lIGRpc3RpbmN0KCkpICU+JQogIGZ1bGxfam9pbihqYWNjYXJkX2FsbCAlPiUgc2VsZWN0KGNvbnRhaW5zKCJfQiIpKSAlPiUgZGlzdGluY3QoKSkgJT4lCiAgbXV0YXRlKGxhYl9BID0gcGFzdGUocGFzdGUoY291bnRyeV9BLCBhZ2VfZ3JvdXBfQSksIGZhY3Rvcl9sYWJkZXNjcmlwdF9BLCBzZXAgPSAiLCAiKSwKICAgICAgICAgbGFiX0IgPSBwYXN0ZShwYXN0ZShjb3VudHJ5X0IsIGFnZV9ncm91cF9CKSwgZmFjdG9yX2xhYmRlc2NyaXB0X0IsIHNlcCA9ICIsICIpKQojIG11dGF0ZShzYW1wbGVfQSA9IHBhc3RlKGNvdW50cnlfQSwgYWdlX2dyb3VwX0EsIHNlcCA9ICIsICIpLAojICAgICAgICBzYW1wbGVfQiA9IHBhc3RlKGNvdW50cnlfQiwgYWdlX2dyb3VwX0IsIHNlcCA9ICIsICIpLAojICAgICAgICBsYWJfQSA9IHBhc3RlKHNhbXBsZV9BLCBmYWN0b3JfbGFiZGVzY3JpcHRfQSwgc2VwID0gIiAiKSwKIyAgICAgICAgbGFiX0IgPSBwYXN0ZShzYW1wbGVfQiwgZmFjdG9yX2xhYmRlc2NyaXB0X0IsIHNlcCA9ICIgIikpCmBgYAoKYGBge3IgamFjY2FyZCBhbGwgcGFpcnMgcGxvdCwgZmlnLndpZHRoID0gOS41LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSAyIGVxdWl2YWxlbnQKamFjY2FyZF9sb3dlcl9saW0gPC0gaWZlbHNlKG1pbihqYWNjYXJkX2FsbF9vcmRlcmVkJGphY2NhcmQpID4gMCwgMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oamFjY2FyZF9hbGxfb3JkZXJlZCRqYWNjYXJkKSkKIyBqYWNjYXJkX3Bsb3RfY29sb3JzIDwtIGMoInJlZDQiLCAiYmx1ZTQiLCAiZGFya29yY2hpZDQiLCAiYmxhY2siKQojIGphY2NhcmRfcGxvdF9jb2xvcnMgPC0gYygiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siKQpqYWNjYXJkX3Bsb3RfY29sb3JzIDwtIGMoInJlZDQiLCAicmVkNCIsICJyZWQ0IiwgImJsYWNrIikKCmphY2NhcmRfYWxsX29yZGVyZWQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihsYWJfQSwgYXMubnVtZXJpYyhmYWN0b3JfQV9vcmRlcmVkKSksCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihsYWJfQiwgYXMubnVtZXJpYyhkZXNjKGZhY3Rvcl9CX29yZGVyZWQpKSksCiAgICAgICAgICAgICBmaWxsID0gamFjY2FyZCkpICsgCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjYXNlX3doZW4oCiAgICAjIGphY2NhcmQgJWluJSBjKDAsIDEpIH4gZm9ybWF0KHJvdW5kKGphY2NhcmQsIDApLCBuc21hbGwgPSAwKSwKICAgIFRSVUUgfiBmb3JtYXQocm91bmQoamFjY2FyZCwgMiksIG5zbWFsbCA9IDIpKSwKICAgIGNvbG9yID0gY2FzZV93aGVuKGphY2NhcmQgPj0gMC43NSB+ICJhIiwgCiAgICAgICAgICAgICAgICAgICAgICBqYWNjYXJkID49IDAuNSB+ICJiIiwKICAgICAgICAgICAgICAgICAgICAgIGphY2NhcmQgPj0gMC4yNSB+ICJjIiwKICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZCIpKSwKICAgIHNob3cubGVnZW5kID0gRikgKwogICMgIyBtaW5kLWxpa2UgYW5kIG90aGVyIGZhY3RvcnMKICAjIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDAuNSwgeG1heCA9IDE0LjUsIHltaW4gPSAxNy41LCB5bWF4ID0gMzEuNSwKICAjICAgICAgICAgIGNvbG9yID0gamFjY2FyZF9wbG90X2NvbG9yc1syXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgIyAjIGJvZHktbGlrZSBmYWN0b3JzCiAgIyBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxNC41LCB4bWF4ID0gMjQuNSwgeW1pbiA9IDcuNSwgeW1heCA9IDE3LjUsCiAgIyAgICAgICAgICBjb2xvciA9IGphY2NhcmRfcGxvdF9jb2xvcnNbMV0sIHNpemUgPSAxLjUsIGFscGhhID0gMCkgKwogICMgIyBoZWFydC1saWtlIGZhY3RvcnMKICAjIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDI0LjUsIHhtYXggPSAzMS41LCB5bWluID0gMC41LCB5bWF4ID0gNy41LAogICMgICAgICAgICAgY29sb3IgPSBqYWNjYXJkX3Bsb3RfY29sb3JzWzNdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYygjdHJhbnMgPSBzY2FsZXM6OmV4cF90cmFucyhiYXNlID0gZXhwKDEpKSwKICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKGphY2NhcmRfbG93ZXJfbGltLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoamFjY2FyZF9sb3dlcl9saW0sIDEsIDAuMDUpLAogICAgICAgICAgICAgICAgICAgICAgICMgbGFiZWxzID0gYyhmb3JtYXQoc2VxKGphY2NhcmRfbG93ZXJfbGltLCAwLjgsIDAuMDUpLCAKICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAiMC44NSA9IG1vZGVyYXRlIiwgIjAuOTAiLAogICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAiMC45NSA9IGhpZ2giLCAiMS4wMCIpLAogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJ2aXJpZGlzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIyBkaXJlY3Rpb24gPSAtMSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDQwKSkgKwogICMgc2NhbGVfZmlsbF9ncmFkaWVudG4oI3RyYW5zID0gc2NhbGVzOjpleHBfdHJhbnMoYmFzZSA9IGV4cCgxKSksCiAgIyAgIGxpbWl0cyA9IGMoamFjY2FyZF9sb3dlcl9saW0sIDEpLCAKICAjICAgYnJlYWtzID0gc2VxKGphY2NhcmRfbG93ZXJfbGltLCAxLCAwLjA1KSwKICAjICAgbGFiZWxzID0gYyhmb3JtYXQoc2VxKGphY2NhcmRfbG93ZXJfbGltLCAwLjgsIDAuMDUpLCBuc21hbGwgPSAyKSwKICAjICAgICAgICAgICAgICAiMC44NSA9IG1vZGVyYXRlIiwgIjAuOTAiLCAKICAjICAgICAgICAgICAgICAiMC45NSA9IGhpZ2giLCAiMS4wMCIpLAogICMgICBjb2xvcnMgPSB2aXJpZGlzTGl0ZTo6dmlyaWRpcyg2KSwKICAjICAgdmFsdWVzID0gYygwLCAwLjY1LCAwLjc1LCAwLjg1LCAwLjk1LCAxKSwKICAjICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA0MCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siLCAiZ3JheTYwIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgICMgYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEsCiAgICAgIGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICBzaXplID0gc2l6ZV9mdW4oamFjY2FyZF9hbGxfb3JkZXJlZCRsYWJfQSwgc2l6ZXMgPSBjKDIwLCAxNCkpLAogICAgICBjb2xvciA9IGNvbG9yX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gamFjY2FyZF9wbG90X2NvbG9ycyksCiAgICAgIGZhY2UgID0gZmFjZV9mdW4oamFjY2FyZF9hbGxfb3JkZXJlZCRsYWJfQSkpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSByZXYoc2l6ZV9mdW4oamFjY2FyZF9hbGxfb3JkZXJlZCRsYWJfQSwgc2l6ZXMgPSBjKDIwLCAxNCkpKSwKICAgICAgY29sb3IgPSByZXYoY29sb3JfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIGNvbG9yX2xpc3QgPSBqYWNjYXJkX3Bsb3RfY29sb3JzKSksCiAgICAgIGZhY2UgID0gcmV2KGZhY2VfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EpKSksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDIwKSwKICAgICMgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShzaXplID0gMC41KSwKICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfbGluZSgKICAgICAgc2l6ZSA9IHNpemVfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygxLjUsIDAuNSkpLAogICAgICBjb2xvciA9IGNvbG9yX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gamFjY2FyZF9wbG90X2NvbG9ycykpLAogICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9saW5lKAogICAgICBzaXplID0gcmV2KHNpemVfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygxLjUsIDAuNSkpKSwKICAgICAgY29sb3IgPSByZXYoY29sb3JfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIGNvbG9yX2xpc3QgPSBqYWNjYXJkX3Bsb3RfY29sb3JzKSkpLAogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KDAuMjUsICJjbSIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSAiSmFjY2FyZFxuc2ltaWxhcml0eSIpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwMl9vYmxpcXVlX2phY2NhcmQucG5nIikKYGBgCgojIyBEZXZlbG9wbWVudGFsIGNvbXBhcmlzb25zCgpgYGB7ciBkZXYgY29tcCBhbGwgc2l0ZXMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjJ9CiMgRklHVVJFIFM1LCBGSUdVUkUgUzYsIEZJR1VSRSBTNywgRklHVVJFIFM4LCBGSUdVUkUgUzkKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV91c19hZHVsdHMsIGVmYV91c19jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIlVTIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA1X29ibGlxdWUucG5nIikKCnBsb3RfZ3JpZChoZWF0bWFwX2NvbXBfZnVuKAogIGVmYV9saXN0ID0gbGlzdChlZmFfZ2hfYWR1bHRzLCBlZmFfZ2hfY2hpbGRyZW4pLCBwYWRkaW5nID0gRiksCiAgZGV2X2NvbmdfcGxvdF9mdW4oY29uZ19kZl9jaGlsZHJlbiwgd2hpY2hfY291bnRyeSA9ICJHaGFuYSIsIHBhZGRpbmcgPSBUKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDEuNSksIGxhYmVscyA9ICJBVVRPIikKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwNl9vYmxpcXVlLnBuZyIpCgpwbG90X2dyaWQoaGVhdG1hcF9jb21wX2Z1bigKICBlZmFfbGlzdCA9IGxpc3QoZWZhX3RoX2FkdWx0cywgZWZhX3RoX2NoaWxkcmVuKSwgcGFkZGluZyA9IEYpLAogIGRldl9jb25nX3Bsb3RfZnVuKGNvbmdfZGZfY2hpbGRyZW4sIHdoaWNoX2NvdW50cnkgPSAiVGhhaWxhbmQiLCBwYWRkaW5nID0gVCksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygyLCAxLjUpLCBsYWJlbHMgPSAiQVVUTyIpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDdfb2JsaXF1ZS5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV9jaF9hZHVsdHMsIGVmYV9jaF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIkNoaW5hIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA4X29ibGlxdWUucG5nIikKCnBsb3RfZ3JpZChoZWF0bWFwX2NvbXBfZnVuKAogIGVmYV9saXN0ID0gbGlzdChlZmFfdnRfYWR1bHRzLCBlZmFfdnRfY2hpbGRyZW4pLCBwYWRkaW5nID0gRiksCiAgZGV2X2NvbmdfcGxvdF9mdW4oY29uZ19kZl9jaGlsZHJlbiwgd2hpY2hfY291bnRyeSA9ICJWYW51YXR1IiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA5X29ibGlxdWUucG5nIikKYGBgCgpgYGB7ciBsb2FkaW5ncyBhbGwgc2FtcGxlcywgZmlnLndpZHRoID0gNi41LCBmaWcuYXNwID0gMC42fQojIEZJR1VSRSAxLCB2ZXJzaW9uIDEKaGVhdG1hcF9jb21wX2Z1bihsaXN0KGVmYV91c19hZHVsdHMsIGVmYV9naF9hZHVsdHMsIGVmYV90aF9hZHVsdHMsIAogICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2FkdWx0cywgZWZhX3Z0X2FkdWx0cywgCiAgICAgICAgICAgICAgICAgICAgICBlZmFfdXNfY2hpbGRyZW4sIGVmYV9naF9jaGlsZHJlbiwgZWZhX3RoX2NoaWxkcmVuLCAKICAgICAgICAgICAgICAgICAgICAgIGVmYV9jaF9jaGlsZHJlbiwgZWZhX3Z0X2NoaWxkcmVuKSwgCiAgICAgICAgICAgICAgICAgZmFjZXRfb3JkZXJfdmFycyA9IGMoImFnZV9ncm91cCIsICJjb3VudHJ5IiwgImZudW0iKSwKICAgICAgICAgICAgICAgICBmYWNldF9sYWJfc3BsaXQgPSBUKSArCiAgdGhlbWUocGFuZWwuc3BhY2luZy54ID0gdW5pdChjKHJlcCgwLjIsIDQpLCAxLCByZXAoMC4yLCA0KSksICJsaW5lIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gMzAsIGJhcmhlaWdodCA9IDAuNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJGYWN0b3IgbG9hZGluZyIsIHRpdGxlLnZqdXN0ID0gMSkpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwMXYxX29ibGlxdWUucG5nIikKYGBgCgpgYGB7ciBkb21pbmFudCBmYWN0b3IsIGZpZy53aWR0aCA9IDYuNSwgZmlnLmFzcCA9IDAuNiwgaW5jbHVkZSA9IEZ9CiMgaGlnaGxpZ2h0aW5nIGRvbWluYW50IGZhY3RvciAoaWdub3JpbmcgY3Jvc3MtbG9hZGluZ3MgPiAwLjA1KQpsb2FkaW5nc19hbGwgPC0gbG9hZGluZ3NfYWR1bHRzICU+JQogIHNlbGVjdCgtY29udGFpbnMoIm9yZCIpKSAlPiUKICBmdWxsX2pvaW4obG9hZGluZ3NfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgc2VsZWN0KC1jb250YWlucygib3JkIikpKQoKZG9tX2ZhY3RvcnNfYWxsIDwtIGxvYWRpbmdzX2FsbCAlPiUKICBncm91cF9ieShjb3VudHJ5LCBhZ2VfZ3JvdXAsIGNhcGFjaXR5KSAlPiUgCiAgdG9wX24oMSwgYWJzKGxvYWRpbmcpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGFnZV9ncm91cCwgY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgcmVuYW1lKGRvbV9mYWN0b3IgPSBmYWN0b3IsCiAgICAgICAgIGRvbV9sb2FkaW5nID0gbG9hZGluZykKCnJlY3RfZGYgPC0gbG9hZGluZ3NfYWxsICU+JQogIGZ1bGxfam9pbihkb21fZmFjdG9yc19hbGwpICU+JQogIG11dGF0ZShmbnVtID0gZ3N1YigiLipfRiIsICJGIiwgZmFjdG9yKSkgJT4lCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgiZmFjdG9yIikpICU+JQogIHNwcmVhZChmbnVtLCBsb2FkaW5nKSAlPiUKICBtdXRhdGUoZGlmZjEgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYxKSwKICAgICAgICAgZGlmZjIgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYyKSwKICAgICAgICAgZGlmZjMgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYzKSwKICAgICAgICAgZGlmZjQgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEY0KSkgJT4lCiAgc2VsZWN0KC1jKGRvbV9sb2FkaW5nLCBzdGFydHNfd2l0aCgiRiIpKSkgJT4lCiAgZ2F0aGVyKHdoaWNoX2RpZmYsIGRpZmYsIHN0YXJ0c193aXRoKCJkaWZmIikpICU+JQogIGZpbHRlcihkaWZmICE9IDAsICFpcy5uYShkaWZmKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSkgJT4lCiAgdG9wX24oLTEsIGRpZmYpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoYW55X3NtYWxsID0gZGlmZiA8IDAuMDUpICU+JQogIHJlbmFtZShmYWN0b3IgPSBkb21fZmFjdG9yKSAlPiUKICBsZWZ0X2pvaW4oZnVsbF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMsIGZhY3Rvcl9uYW1lc19jaGlsZHJlbikpCgojIGFuYWxvZyB0byBGSUdVUkUgMQp0ZW1wX2NhcF9vcmRlciA8LSBmYS5zb3J0KGVmYV91c19hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkgJT4lIHJldigpCgpnZ3Bsb3QocmVjdF9kZiAlPiUKICAgICAgICAgZmlsdGVyKCFpcy5uYShhbnlfc21hbGwpKSAlPiUKICAgICAgICAgbXV0YXRlKGNhcGFjaXR5ID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSB0ZW1wX2NhcF9vcmRlcikpLAogICAgICAgYWVzKHggPSBmYWN0b3JfbGFiZGVzY3JpcHQsIAogICAgICAgICAgIHkgPSBjYXBhY2l0eSwgCiAgICAgICAgICAgZmlsbCA9IGFueV9zbWFsbCkpICsKICBmYWNldF9ncmlkKH4gaW50ZXJhY3Rpb24oY291bnRyeSwgYWdlX2dyb3VwKSwgc3BhY2UgPSAiZnJlZSIsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21fdGlsZSgpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nLnggPSB1bml0KGMocmVwKDAuMiwgNCksIDEsIHJlcCgwLjIsIDQpKSwgImxpbmUiKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCiMgZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAxdjJfb2JsaXF1ZS5wbmciKQpgYGAKCmBgYHtyIGxvYWRpbmdzIGFsbCBzYW1wbGVzIHYyLCBmaWcud2lkdGggPSA2LjUsIGZpZy5hc3AgPSAwLjZ9CiMgRklHVVJFIDEsIHZlcnNpb24gMiAoaW5jbHVkZWQgaW4gbWFpbiB0ZXh0KQpsb2FkaW5nc19hZHVsdHMgJT4lCiAgYmluZF9yb3dzKGxvYWRpbmdzX2NoaWxkcmVuKSAlPiUKICAjIHNlbGVjdCgtY29udGFpbnMoIl9vcmQiKSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9iaG0gPSBjYXNlX3doZW4oCiAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0KSkgfiAiQk9EWS1saWtlIGZhY3RvcnMiLAogICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdCkpIH4gIk1JTkQtbGlrZSBmYWN0b3JzIiwKICAgIGdyZXBsKCJoZWFydCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0KSkgfiAiSEVBUlQtbGlrZSBmYWN0b3JzIiwKICAgIFRSVUUgfiAiT3RoZXIiKSkgJT4lCiAgbGVmdF9qb2luKHN0cm9uZ19ub25jcm9zc19sb2FkX2FsbCAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGZhY3RvciwgY2FwYWNpdHksIHN0cm9uZ19sb2FkLCBjcm9zc19sb2FkKSkgJT4lCiAgbXV0YXRlKGZvbnRfZmFjZSA9IGNhc2Vfd2hlbigKICAgIHN0cm9uZ19sb2FkID09IDEgJiBpcy5uYShjcm9zc19sb2FkKSB+ICJib2xkIiwKICAgIFRSVUUgfiAicGxhaW4iKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihwYXN0ZShnc3ViKCJGYWN0b3IgIiwgIkYiLCBmYWN0b3JfbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2Rlc2NyaXB0LCBzZXAgPSAiOiAiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBhcy5udW1lcmljKGNvdW50cnkpKSwgCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihjYXBhY2l0eV9vcmRfdXMsIGRlc2MoY2FwYWNpdHlfb3JkX3VzKSksCiAgICAgICAgICAgICBmaWxsID0gbG9hZGluZykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGZhY3Rvcl9iaG0sIGFnZV9ncm91cCksIAogICAgICAgICAgICAgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGxvYWRpbmcsIDIpLCBuc21hbGwgPSAyKSwgCiAgICAgICAgICAgICAgICBmb250ZmFjZSA9IGZvbnRfZmFjZSksIHNpemUgPSAzKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgcGFuZWwuc3BhY2luZy54ID0gdW5pdChjKDAuMiwgMSwgMC4yLCAxLCAwLjIsIDEsIDAuMiksICJsaW5lIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKGJhcndpZHRoID0gMzAsIGJhcmhlaWdodCA9IDAuNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJGYWN0b3IgbG9hZGluZyIsIHRpdGxlLnZqdXN0ID0gMSkpCiAgIyBzZWxlY3QoY291bnRyeSwgY2FwYWNpdHksIGxvYWRpbmcpICU+JQogICMgbXV0YXRlKGxvYWRpbmcgPSByb3VuZChsb2FkaW5nLCAyKSkgJT4lCiAgIyBzcHJlYWQoY291bnRyeSwgbG9hZGluZykKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAxdjJfb2JsaXF1ZS5wbmciKQpgYGAKCiMjIFZhcmlhbmNlIGFjY291bnRlZCBmb3IKCmBgYHtyfQpWYWNjb3VudGVkX2Z1biA8LSBmdW5jdGlvbihlZmFfbmFtZSkgewogIGNvdW50cnkgPC0gZ3N1YigiZWZhXyIsICIiLCBlZmFfbmFtZSkKICBjb3VudHJ5IDwtIGdzdWIoIl8uKiQiLCAiIiwgY291bnRyeSkKICBhZ2VfZ3JvdXAgPC0gY2FzZV93aGVuKGdyZXBsKCJhZHVsdCIsIGVmYV9uYW1lKSB+ICJhZHVsdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImNoaWxkIiwgZWZhX25hbWUpIH4gImNoaWxkcmVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKQogIAogIGVmYSA8LSBnZXQoZWZhX25hbWUpCiAgcmVzIDwtIGVmYSRWYWNjb3VudGVkICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJtZXRyaWMiKSAlPiUKICAgIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2giLCAidGgiLCAiY2giLCAidnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgICBhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLCBsZXZlbHMgPSBjKCJhZHVsdHMiLCAiY2hpbGRyZW4iKSkpCiAgCiAgcmV0dXJuKHJlcykKfQpgYGAKCmBgYHtyfQpWYWNjb3VudGVkX2FsbCA8LSBWYWNjb3VudGVkX2Z1bigiZWZhX3VzX2FkdWx0cyIpICU+JQogIGZ1bGxfam9pbihWYWNjb3VudGVkX2Z1bigiZWZhX2doX2FkdWx0cyIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV90aF9hZHVsdHMiKSkgJT4lCiAgZnVsbF9qb2luKFZhY2NvdW50ZWRfZnVuKCJlZmFfY2hfYWR1bHRzIikpICU+JQogIGZ1bGxfam9pbihWYWNjb3VudGVkX2Z1bigiZWZhX3Z0X2FkdWx0cyIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV91c19jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV9naF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV90aF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV9jaF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV92dF9jaGlsZHJlbiIpKQpgYGAKCmBgYHtyfQpWYWNjb3VudGVkX2FsbCAlPiUKICBmaWx0ZXIobWV0cmljICVpbiUgYygiUHJvcG9ydGlvbiBWYXIiLCAiUHJvcG9ydGlvbiBFeHBsYWluZWQiKSkgJT4lCiAgZ2F0aGVyKGZhY3RvciwgdmFsdWUsIHN0YXJ0c193aXRoKCJGIikpICU+JQogIG11dGF0ZSh2YWx1ZSA9IHJvdW5kKHZhbHVlLCAyKSkgJT4lCiAgc3ByZWFkKGNvdW50cnksIHZhbHVlKSAlPiUKICBhcnJhbmdlKGFnZV9ncm91cCwgZmFjdG9yLCBtZXRyaWMpCmBgYApgYGB7cn0KVmFjY291bnRlZF9hbGwgJT4lCiAgZmlsdGVyKG1ldHJpYyA9PSAiQ3VtdWxhdGl2ZSBWYXIiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCB2YWx1ZSwgc3RhcnRzX3dpdGgoIkYiKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlX2dyb3VwKSAlPiUKICB0b3BfbigxLCB2YWx1ZSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh2YWx1ZSA9IHJvdW5kKHZhbHVlLCAyKSkgJT4lCiAgc2VsZWN0KG1ldHJpYywgY291bnRyeSwgYWdlX2dyb3VwLCB2YWx1ZSkgJT4lCiAgc3ByZWFkKGNvdW50cnksIHZhbHVlKSAlPiUKICBhcnJhbmdlKGFnZV9ncm91cCwgbWV0cmljKQpgYGAKCiMjIEludGVyZmFjdG9yIGNvcnJlbGF0aW9ucwoKYGBge3IsIGluY2x1ZGUgPSBGfQppbnRlcmZhY3Rvcl9jb3JfZnVuIDwtIGZ1bmN0aW9uKGVmYV9uYW1lKSB7CiAgc2FtcGxlID0gZ3N1YigiZWZhXyIsICIiLCBlZmFfbmFtZSkKICBjb3VudHJ5ID0gZ3N1YigiXy4qJCIsICIiLCBzYW1wbGUpCiAgYWdlX2dyb3VwID0gZ3N1YigiXi4qXyIsICIiLCBzYW1wbGUpCiAgCiAgZWZhIDwtIGdldChlZmFfbmFtZSkKICAKICAjIGhhY2t5LCBub3Qgc3VyZSB3aHkgdGhpcyB3b3JrcywgYnV0IGl0J3MgdGhlIG9ubHkgd2F5IGkgY291bGQgZ2V0IENJcwogIGRmIDwtIHByaW50KGVmYSkgJT4lCiAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICByb3duYW1lc190b19jb2x1bW4oImZhY3Rvcl9wYWlyIikgJT4lCiAgICBzZXBhcmF0ZShmYWN0b3JfcGFpciwgYygiZmFjdG9yX0EiICwiZmFjdG9yX0IiKSwgc2VwID0gIi0iKSAlPiUKICAgIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJmYWN0b3IiKSksIH4gZ3N1YigiXi4qXyIsICIiLCAuKSkKICAKICAjIGRmIDwtIGVmYSRQaGkgJT4lCiAgIyAgIGRhdGEuZnJhbWUoKSAlPiUKICAjICAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfQSIpCiAgIyBnYXRoZXIoZmFjdG9yX0IsIHBoaSwgLWZhY3Rvcl9BKQogIAogIGRmIDwtIGRmICU+JQogIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJmYWN0b3IiKSksCiAgICAgICAgICAgIH4gcGFzdGUwKGNvdW50cnksIHRvdXBwZXIoYWdlX2dyb3VwKSwgIl8iLCAuKSkgJT4lCiAgICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2giLCAidGgiLCAiY2giLCAidnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgICBhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLCBsZXZlbHMgPSBjKCJhZHVsdHMiLCAiY2hpbGRyZW4iKSkpCiAgCiAgcmV0dXJuKGRmKQp9CmBgYAoKYGBge3IsIHJlc3VsdHMgPSAiaGlkZSIsICwgaW5jbHVkZSA9IEZ9CmRfcGhpIDwtIGJpbmRfcm93cyhpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfdXNfYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfZ2hfYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfdGhfYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfY2hfYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfdnRfYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfdXNfY2hpbGRyZW4iKSwKICAgICAgICAgICAgICAgICAgIGludGVyZmFjdG9yX2Nvcl9mdW4oImVmYV9naF9jaGlsZHJlbiIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3RoX2NoaWxkcmVuIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfY2hfY2hpbGRyZW4iKSwKICAgICAgICAgICAgICAgICAgIGludGVyZmFjdG9yX2Nvcl9mdW4oImVmYV92dF9jaGlsZHJlbiIpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KZF9waGkgPC0gZF9waGkgJT4lCiAgZnVsbF9qb2luKGRfcGhpICU+JQogICAgICAgICAgICAgIHJlbmFtZV9hbGwofiBnc3ViKCJmYWN0b3JfQSIsICJmYWN0b3JfQyIsIC4pKSAlPiUKICAgICAgICAgICAgICByZW5hbWVfYWxsKH4gZ3N1YigiZmFjdG9yX0IiLCAiZmFjdG9yX0QiLCAuKSkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+IGdzdWIoImZhY3Rvcl9EIiwgImZhY3Rvcl9BIiwgLikpICU+JQogICAgICAgICAgICAgIHJlbmFtZV9hbGwofiBnc3ViKCJmYWN0b3JfQyIsICJmYWN0b3JfQiIsIC4pKSkgJT4lIGRpc3RpbmN0KCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmRfcGhpIDwtIGRfcGhpICU+JQogIHNlbGVjdCgtY291bnRyeSwgLWFnZV9ncm91cCkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgZnVsbF9qb2luKGZhY3Rvcl9uYW1lc19jaGlsZHJlbikgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+cGFzdGUwKC4sICJfQSIpKSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9iaG1fQSA9IGNhc2Vfd2hlbigKICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkJvZHktbGlrZSBmYWN0b3IiLAogICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiTWluZC1saWtlIGZhY3RvciIsCiAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiSGVhcnQtbGlrZSBmYWN0b3IiLAogICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICBmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuKSAlPiUKICAgICAgICAgICAgICByZW5hbWVfYWxsKH5wYXN0ZTAoLiwgIl9CIikpKSAlPiUKICBtdXRhdGUoZmFjdG9yX2JobV9CID0gY2FzZV93aGVuKAogICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSkgfiAiQm9keS1saWtlIGZhY3RvciIsCiAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSB+ICJNaW5kLWxpa2UgZmFjdG9yIiwKICAgIGdyZXBsKCJoZWFydCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSB+ICJIZWFydC1saWtlIGZhY3RvciIsCiAgICBUUlVFIH4gIk90aGVyIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKGZhY3Rvcl9iaG1fQSwgZmFjdG9yX2JobV9CKSwKICAgICAgICAgICAgfiBmYWN0b3IoLiwgbGV2ZWxzID0gYygiQm9keS1saWtlIGZhY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYXJ0LWxpa2UgZmFjdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWluZC1saWtlIGZhY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk90aGVyIikpKSAlPiUKICBzZWxlY3QoLWNvdW50cnlfQiwgLWFnZV9ncm91cF9CKSAlPiUKICByZW5hbWUoY291bnRyeSA9IGNvdW50cnlfQSwgYWdlX2dyb3VwID0gYWdlX2dyb3VwX0EpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLCAsIGluY2x1ZGUgPSBGfQpkX3BoaSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3JfYmhtX0EsIAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoZmFjdG9yX2JobV9CLCBkZXNjKGZhY3Rvcl9iaG1fQikpLCAKICAgICAgICAgICAgIGZpbGwgPSBlc3RpbWF0ZSkpICsKICBmYWNldF9ncmlkKGNvdW50cnkgfiBhZ2VfZ3JvdXAsIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChlc3RpbWF0ZSwgMiksIG5zbWFsbCA9IDIpKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gcXVvdGUocGhpKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuNiwgaW5jbHVkZSA9IEZ9CmRfcGhpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3Rvcl9iaG1fQSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksCiAgICAgICAgICAgICAjIHNoYXBlID0gYWdlX2dyb3VwLAogICAgICAgICAgICAgeSA9IGVzdGltYXRlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDUsIGNvbG9yID0gImdyYXk1MCIpICsKICBmYWNldF9ncmlkKGFnZV9ncm91cCB+IGZhY3Rvcl9iaG1fQiwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSAyKSArCiAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGVzdGltYXRlLCAyKSwgbnNtYWxsID0gMikpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoTkEsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gcXVvdGUocGhpKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNywgaW5jbHVkZSA9IEZ9CmRfcGhpICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnksIAogICAgICAgICAgICAgY29sb3IgPSBjb3VudHJ5LAogICAgICAgICAgICAgZ3JvdXAgPSBhZ2VfZ3JvdXAsIHNoYXBlID0gYWdlX2dyb3VwLAogICAgICAgICAgICAgeSA9IGVzdGltYXRlKSkgKwogIGZhY2V0X2dyaWQoZmFjdG9yX2JobV9BIH4gZmFjdG9yX2JobV9CLCBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyLCBjb2xvciA9ICJncmV5NTAiKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgIyBnZW9tX3RleHQoYWVzKHkgPSBpZmVsc2UoYWdlX2dyb3VwID09ICJhZHVsdHMiLCAKICAjICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZSArIDAuMSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZSAtIDAuMDUpLAogICMgICAgICAgICAgICAgICBsYWJlbCA9IGZvcm1hdChyb3VuZChlc3RpbWF0ZSwgMiksIG5zbWFsbCA9IDIpKSwKICAjICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKE5BLCAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IHF1b3RlKHBoaSksIAogICAgICAgc2hhcGUgPSAiQWdlIGdyb3VwIiwgc2l6ZSA9ICJBZ2UgZ3JvdXAiLCAKICAgICAgIGNvbG9yID0gIlNpdGUiKQpgYGAKCmBgYHtyfQpjYXQoIlVTIEFEVUxUU1xuIikKZWZhX3VzX2FkdWx0cyRQaGkKIyAoZWZhX3VzX2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5VUyBDSElMRFJFTlxuIikKZWZhX3VzX2NoaWxkcmVuJFBoaQojIChlZmFfdXNfY2hpbGRyZW4kUGhpKV4yCmBgYAoKYGBge3J9CmNhdCgiR0hBTkEgQURVTFRTXG4iKQplZmFfZ2hfYWR1bHRzJFBoaQojIChlZmFfZ2hfYWR1bHRzJFBoaSleMgoKY2F0KCJcbkdIQU5BIENISUxEUkVOXG4iKQplZmFfZ2hfY2hpbGRyZW4kUGhpCiMgKGVmYV9naF9jaGlsZHJlbiRQaGkpXjIKYGBgCgpgYGB7cn0KY2F0KCJUSEFJTEFORCBBRFVMVFNcbiIpCmVmYV90aF9hZHVsdHMkUGhpCiMgKGVmYV90aF9hZHVsdHMkUGhpKV4yCgpjYXQoIlxuVEhBSUxBTkQgQ0hJTERSRU5cbiIpCmVmYV90aF9jaGlsZHJlbiRQaGkKIyAoZWZhX3RoX2NoaWxkcmVuJFBoaSleMgpgYGAKCmBgYHtyfQpjYXQoIkNISU5BIEFEVUxUU1xuIikKZWZhX2NoX2FkdWx0cyRQaGkKIyAoZWZhX2NoX2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5DSElOQSBDSElMRFJFTlxuIikKZWZhX2NoX2NoaWxkcmVuJFBoaQojIChlZmFfY2hfY2hpbGRyZW4kUGhpKV4yCmBgYAoKYGBge3J9CmNhdCgiVkFOVUFUVSBBRFVMVFNcbiIpCmVmYV92dF9hZHVsdHMkUGhpCiMgKGVmYV92dF9hZHVsdHMkUGhpKV4yCgpjYXQoIlxuVkFOVUFUVSBDSElMRFJFTlxuIikKZWZhX3Z0X2NoaWxkcmVuJFBoaQojIChlZmFfdnRfY2hpbGRyZW4kUGhpKV4yCmBgYAoKCg==